初学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/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任何脚本.

$ 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的值, 使其输出脚本名, 函数名, 行数等更详细的信息

$ 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脚本debug攻略的更多相关文章

  1. Jmeter脚本录制攻略

    基于Apache JMeter(5.2.1) 首先在TestPlan里添加一个HTTP代理服务武器: 设置端口,在目标控制器里选择线程组. 在Chrome浏览器里设置代理: 点击启动按钮后,在浏览器登 ...

  2. Linux Shell脚本攻略 读书笔记

    Linux Shell脚本攻略 读书笔记 这是一本小书,总共253页,但内容却很丰富,书中的示例小巧而实用,对我这样总是在shell门前徘徊的人来说真是如获至宝:最有价值的当属文本处理,对这块我单独整 ...

  3. Linux Shell脚本攻略

    -Linux Shell脚本攻略 总结的来说,这本书很实践性和实用性强,都是给的具体的例子,直接可以在终端操作实践,比单纯只看不动手务实多了,另外就是,这本书涵盖的内容也比较广,从文本操作到服务器管理 ...

  4. 老李分享:《Linux Shell脚本攻略》 要点(八)

    老李分享:<Linux Shell脚本攻略> 要点(八)   1.打印进程 [root@localhost program_test]# ps -e | head  PID TTY     ...

  5. 老李分享:《Linux Shell脚本攻略》 要点(七)

    老李分享:<Linux Shell脚本攻略> 要点(七)   1.显示给定文件夹下的文件的磁盘适用情况 [root@localhost program_test]# du -a -h ./ ...

  6. 老李分享:《Linux Shell脚本攻略》 要点(六)

    老李分享:<Linux Shell脚本攻略> 要点(六)   1.打印网络接口列表 [root@localhost touch_more]# ifconfig | cut -c-10 | ...

  7. 老李分享:《Linux Shell脚本攻略》 要点(五)

    老李分享:<Linux Shell脚本攻略> 要点(五)   //1.打包.解包 [root@localhost program_test]# tar -cf output.tar 11. ...

  8. 老李分享:《Linux Shell脚本攻略》 要点(四)

    老李分享:<Linux Shell脚本攻略> 要点(四)   1.IP地址的正则表达式: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 2. ...

  9. 老李分享:《Linux Shell脚本攻略》 要点(三)

    老李分享:<Linux Shell脚本攻略> 要点(三)   1.生产任意大小的文件 [root@localhost dd_test]#[root@localhost dd_test]# ...

随机推荐

  1. openstack之Designate组件,入门级安装(快速)

    @ 目录 前言 架构 前提准备 创建 DNS 服务 API 端点 安装和配置组件 验证操作 前言 Designate 是一个开源 DNS 即服务实施,是用于运行云的 OpenStack 服务生态系统的 ...

  2. vue - Vue路由

    至此基本上vue2.0的内容全部结束,后面还有点elementUI和vue3.0的内容过几天再来更新. 这几天要回学校去参加毕业答辩,断更几天 一.相关理解 是vue的一个插件库,专门用来实现spa( ...

  3. ELK 1.3之kibana

    1.安装kibana,直接压缩包安装就可以,kibana默认端口5601 2.配置kibana配置文件 [root@kibana config]# vim /opt/kibana/config/kib ...

  4. yarn/npm 设置镜像地址

    注意 如果开发 electron 桌面软件,需要设置以下两个镜像地址 disturl.electron_mirror 如果用到了 node-sass 需要设置以下一个镜像地址 sass_binary_ ...

  5. linux篇-图解cacti监控安装

    1登录 admin admin 2点击devices localhost 3进入配置保存 4保存 http服务要启动哦 5一步步做 6graph tree 7执行/usr/bin/php /var/w ...

  6. 130_传析阅管理系统accdb64位版本

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 几年前笔者针对家居门店的进销存.人员管理.工资管理.任务系统.门店经营盈亏管理.销售分析.考勤请假等息息相关的业务基于Ac ...

  7. 将汇总结果导出到MySQL

    ①mysql建表test1 ②cd /opt/module/sqoop进入scoop路径 ③ bin/sqoop export \ > --connect jdbc:mysql://master ...

  8. 负载均衡之LVS的三种模式

    模式一:D-NAT模式 原理:此模式类似NAT网络中,所以此网络内主机发到互联网上的数据包的源目的IP都是NAT路由的IP,在NAT路由上做了IP替换. 把客户端发来的数据的IP头的目的地址在负载均衡 ...

  9. 分享JAVA的FTP和SFTP相关操作工具类

     1.导入相关jar <!--FTPClient--><dependency> <groupId>commons-net</groupId> <a ...

  10. Redis - 持久化 AOF 和 RDB

    Redis - 持久化 AOF 和 RDB AOF AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集. AOF 文件中的命令全部以 Redis 协议的格 ...