Bash脚本debug攻略
初学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呢? 修改脚本的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 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攻略的更多相关文章
- Jmeter脚本录制攻略
基于Apache JMeter(5.2.1) 首先在TestPlan里添加一个HTTP代理服务武器: 设置端口,在目标控制器里选择线程组. 在Chrome浏览器里设置代理: 点击启动按钮后,在浏览器登 ...
- Linux Shell脚本攻略 读书笔记
Linux Shell脚本攻略 读书笔记 这是一本小书,总共253页,但内容却很丰富,书中的示例小巧而实用,对我这样总是在shell门前徘徊的人来说真是如获至宝:最有价值的当属文本处理,对这块我单独整 ...
- Linux Shell脚本攻略
-Linux Shell脚本攻略 总结的来说,这本书很实践性和实用性强,都是给的具体的例子,直接可以在终端操作实践,比单纯只看不动手务实多了,另外就是,这本书涵盖的内容也比较广,从文本操作到服务器管理 ...
- 老李分享:《Linux Shell脚本攻略》 要点(八)
老李分享:<Linux Shell脚本攻略> 要点(八) 1.打印进程 [root@localhost program_test]# ps -e | head PID TTY ...
- 老李分享:《Linux Shell脚本攻略》 要点(七)
老李分享:<Linux Shell脚本攻略> 要点(七) 1.显示给定文件夹下的文件的磁盘适用情况 [root@localhost program_test]# du -a -h ./ ...
- 老李分享:《Linux Shell脚本攻略》 要点(六)
老李分享:<Linux Shell脚本攻略> 要点(六) 1.打印网络接口列表 [root@localhost touch_more]# ifconfig | cut -c-10 | ...
- 老李分享:《Linux Shell脚本攻略》 要点(五)
老李分享:<Linux Shell脚本攻略> 要点(五) //1.打包.解包 [root@localhost program_test]# tar -cf output.tar 11. ...
- 老李分享:《Linux Shell脚本攻略》 要点(四)
老李分享:<Linux Shell脚本攻略> 要点(四) 1.IP地址的正则表达式: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 2. ...
- 老李分享:《Linux Shell脚本攻略》 要点(三)
老李分享:<Linux Shell脚本攻略> 要点(三) 1.生产任意大小的文件 [root@localhost dd_test]#[root@localhost dd_test]# ...
随机推荐
- 虚拟机VMware 安装centos、常规配置、共享文件等
安装centos7[通过vm来安装运行centos7] 一.准备工作 1.centos7 的安装镜像下载链接:http://isoredirect.centos.org/centos/7/isos/x ...
- 题解0011:图书管理(哈希、vector)
信奥一本通--哈希 里的例题2 题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1456 题目描述:两个命令,一个是进一本名字为s的图书,一个是 ...
- 【深度学习 论文篇 03-2】Pytorch搭建SSD模型踩坑集锦
论文地址:https://arxiv.org/abs/1512.02325 源码地址:http://github.com/amdegroot/ssd.pytorch 环境1:torch1.9.0+CP ...
- [笔记] Slope Trick:解决一类凸代价函数的DP优化问题
原理 当序列 DP 的转移代价函数满足 连续: 凸函数: 分段线性函数. 时,可以通过记录分段函数的最右一段 \(f_r(x)\) 以及其分段点 \(L\) 实现快速维护代价的效果. 如:$ f(x) ...
- 一文搞懂 Linux 的 inode!
一个执着于技术的公众号 1.inode 是什么 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于 ...
- Unity实现简单的对象池
一.简介 先说说为什么要使用对象池 在Unity游戏运行时,经常需要生成一些物体,例如子弹.敌人等.虽然Unity中有Instantiate()方法可以使用,但是在某些情况下并不高效.特别是对于那些需 ...
- 老生常谈系列之Aop--Spring Aop源码解析(一)
老生常谈系列之Aop--Spring Aop源码解析(一) 前言 上一篇文章老生常谈系列之Aop--Spring Aop原理浅析大概阐述了动态代理的相关知识,并且最后的图给了一个Spring Aop实 ...
- SpringMVC和spring集成
步骤:1.web.xml中配置spring的监听和spring配置文件位置 2.编写spring类并在spring的配置文件里配置bean 说明:源码中spring核心配置文件导入springAnno ...
- Linux内网渗透
Linux虽然没有域环境,但是当我们拿到一台Linux 系统权限,难道只进行一下提权,捕获一下敏感信息就结束了吗?显然不只是这样的.本片文章将从拿到一个Linux shell开始,介绍Linux内网渗 ...
- vuex+Es6语法补充-Promise
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,采用 集中式存储管理 单页面的状态管理/多页面状态管理 使用步骤: // 1.导入 import Vuex from 'vuex' // ...