Bash脚本debug攻略

  • Bash脚本debug攻略已关闭评论
  • 178 次浏览
  • A+
所属分类:linux技术
摘要

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


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

1. debug某个脚本

执行脚本有两种方式, 一是bash script.sh的方式, 二是./script.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  

2. debug特定脚本

前面说过执行脚本有两种方式, 那如果是用第二种方式执行脚本如何debug呢? 修改脚本的shabangbash -x即可. 每次执行脚本就会输出debug信息.
此方式适合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 script.sh的方式执行脚本, 会发生什么? 居然没有输出debug信息!!!
设置shabang表示设置一个默认解释器, 如果没有指定解释器才会使用shabang中写的解释器. 以bash script.sh的方式执行脚本则指定了解释器为bash, 所以不会有debug信息.

$ bash test.sh  Time: Mon 11 Jul 2022 11:32:12 PM CST User: wbourne  Home: /home/wbourne  

3. debug脚本某一部分

如果脚本比较长, 我们之关心其中一部分, 就可以使用Bash内置命令set来debug部分脚本.
set -x表示开启debug, set +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  

4. PS4

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

$ echo $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. 参考