初学Bash时, 我从未想过想过bash也能debug, 也从未想过去debug Bash脚本. 随着技术的增长, 写的脚本越来越复杂, 使用echo打印日志来调试脚本的方式越来越捉襟见肘了. 直到某天
通读了一遍Bash Reference Manual, 才发现Bash也是可以debug的. 下面就介绍三种debug Bash脚本的方式.
1. debug某个脚本
执行脚本有两种方式, 一是bash script.sh的方式, 二是./script.sh的方式. 通过第一种方式执行脚本时, 加上-x选项即可debug脚本.
输出的结果中, 以+开头的行就是debug输出的信息.
$ cat test.sh#!/bin/bashecho "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 2. debug特定脚本
前面说过执行脚本有两种方式, 那如果是用第二种方式执行脚本如何debug呢? 修改脚本的shabang为bash -x即可. 每次执行脚本就会输出debug信息.
此方式适合debug某个特定的脚本, 而上面的第一种方式则适合debug任何脚本.
$ cat test.sh#!/bin/bash -xecho "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 script.sh的方式执行脚本, 会发生什么? 居然没有输出debug信息!!!
设置shabang表示设置一个默认解释器, 如果没有指定解释器才会使用shabang中写的解释器. 以bash script.sh的方式执行脚本则指定了解释器为bash, 所以不会有debug信息.
$ bash test.sh Time: Mon 11 Jul 2022 11:32:12 PM CSTUser: wbourne Home: /home/wbourne 3. debug脚本某一部分
如果脚本比较长, 我们之关心其中一部分, 就可以使用Bash内置命令set来debug部分脚本.set -x表示开启debug, set +x表示关闭debug
$ cat test.sh#!/bin/bashecho "Time: $(date)"set -xecho "User: $USER"set +xecho "Home: $HOME"$ ./test.sh Time: Mon 11 Jul 2022 11:33:43 PM CST+echo \'User: wbourne \'User: wbourne +set +xHome: /home/wbourne 4. PS4
既然是debug, 那肯定要详细才好. 上述debug只不过是输出了变量值而已, 是不是可以显示更多信息? 当然是可以的, debug信息的提示符是环境变量PS4, 默认为+, 我们可以更改PS4的值, 使其输出脚本名, 函数名, 行数等更详细的信息
$ export PS4=\'+\\e[01;32m[${BASH_SOURCE}:${FUNCNAME[0]}:${LINENO}]\\e[00m\'$ 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 5. 参考
- Bash Reference Manual