Bash脚本debug攻略

初学Bash时, 我从未想过去debug Bash脚本, 也从未想过Bash脚本也能debug. 随着技术的增长, 写的脚本越来越复杂, 使用echo打印日志来调试脚本的方式也越来越捉襟见肘了. 直到某天
通读了一遍Bash Reference Manual, 才发现Bash脚本也是可以debug的. 下面就介绍三种debug Bash脚本的方式.

  1. debug某个脚本

执行Bash脚本有两种方式, 一是 bash test.sh的方式, 二是 ./test.sh的方式.

通过第一种方式执行脚本时, 加上 -x选项即可debug脚本. 输出的结果中, 以 +开头的行就是debug输出的信息.

$ cat test.sh
#!/bin/bash

echo "Time: $(date)"
echo "User: $USER"
echo "Home: $HOME"

$ bash -x test.sh
++date
+echo 'Time: Mon 11 Jul 2022 11:29:37 PM CST'
Time: Mon 11 Jul 2022 11:29:37 PM CST
+echo 'User: wbourne'
User: wbourne
+echo 'Home: /home/wbourne'
Home: /home/wbourne
  1. debug特定脚本

前面说过执行脚本有两种方式, 那如果是用第二种方式执行脚本如何debug呢?

修改脚本的 shabangbash -x即可. 每次执行脚本就会默认输出debug信息. 此方式适合debug某个特定的脚本; 而上面的第一种方式则适合debug任何脚本.

$ cat test.sh
#!/bin/bash -x

echo "Time: $(date)"
echo "User: $USER"
echo "Home: $HOME"

$ ./test.sh
++date
+echo 'Time: Mon 11 Jul 2022 11:32:52 PM CST'
Time: Mon 11 Jul 2022 11:32:52 PM CST
+echo 'User: wbourne '
User: wbourne
+echo 'Home: /home/wbourne '
Home: /home/wbourne

请注意: 如果修改脚本的shabang为 bash -x, 又以 bash test.sh的方式执行脚本, 会发生什么? 居然没有输出debug信息!!!

设置shabang表示设置一个默认解释器, 如果没有指定解释器才会使用shabang设置的解释器, 以 ./test.sh的方式执行脚本就没有指定解释器. 以 bash script.sh的方式执行脚本则指定了解释器为bash, 所以不会有debug信息.

$ bash test.sh
Time: Mon 11 Jul 2022 11:32:12 PM CST
User: wbourne
Home: /home/wbourne
  1. debug脚本某一部分

如果脚本比较长, 我们只关心其中一部分代码的逻辑, 就可以使用Bash内置命令 set来debug部分脚本. set -x表示开启debug, set +x表示关闭debug, 将 set -xset +x分别放到需要debug的代码的开头与结尾就好了.

$ cat test.sh
#!/bin/bash

echo "Time: $(date)"
set -x
echo "User: $USER"
set +x
echo "Home: $HOME"

$ ./test.sh
Time: Mon 11 Jul 2022 11:33:43 PM CST
+echo 'User: wbourne '
User: wbourne
+set +x
Home: /home/wbourne
  1. debug提示符

既然是debug, 那肯定要详细才好. 上述debug只不过是输出了变量值而已, 是不是可以显示更多信息? 当然是可以的, 环境变量 PS4就是debug提示符, 默认为 +, 我们可以更改PS4的值, 使其输出脚本名, 函数名, 行数等更详细的信息.

Tips: 这个提示符还是绿色的哦! 可以很好的区分脚本输出与debug信息!

$ echo $PS4
+

$ export PS4='+\e[01;32m[${BASH_SOURCE}:${FUNCNAME[0]}:${LINENO}]\e[00m'

$ cat test.sh
#!/bin/bash -x

echo "Time: $(date)"
echo "User: $USER"
echo "Home: $HOME"

$ bash -x test.sh
++[test.sh::3]date
+[test.sh::3]echo 'Time: Mon 11 Jul 2022 11:35:08 PM CST'
Time: Mon 11 Jul 2022 11:35:08 PM CST
+[test.sh::4]echo 'User: wbourne '
User: wbourne
+[test.sh::5]echo 'Home: /home/wbourne '
Home: /home/wbourne

Bash脚本debug攻略
  1. 参考

  2. Bash Reference Manual

Original: https://www.cnblogs.com/wbourne/p/16468485.html
Author: 王bourne
Title: Bash脚本debug攻略

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/523108/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球