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
2. debug特定脚本
前面说过执行脚本有两种方式, 那如果是用第二种方式执行脚本如何debug呢?
修改脚本的shabang为bash -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
3. debug脚本某一部分
如果脚本比较长, 我们只关心其中一部分代码的逻辑, 就可以使用Bash内置命令set
来debug部分脚本. set -x
表示开启debug, set +x
表示关闭debug, 将set -x
和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. 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」