【转】如何调试bash脚本
本文转载自:http://coolshell.cn/articles/1379.html
Bash 是Linux操作系统的默认Shell脚本。Shell是用来处理操作系统和用户交互的一个程序。Shell的脚本可以帮助用户自动化地和操作系统进行交互。你也可以理解为一种脚本式的编程。即然有编程,那么,程序的编译器,解释器,调试器就必不可少了,Bash也一样,但在调试方面可能会有一些和编程语言不一样的东西和技术,所以,下面这篇文章主要是说明调试bash脚本的各种技术。
跟踪脚本的执行
你可以让bash打印出你脚本执行的过程中的所有语句。这很简单,只需要使用bash的-x选项就可以做到,下面让我们来看一下。
下面的这段脚本,先是输出一个问候语句,然后输出当前的时间:
1
2
3
|
#!/bin/bash
echo "Hello $USER,"
echo "Today is $(date +'%Y-%m-%d')"
|
下面让我们使用-x选项来运行这段脚本:
1
2
3
4
5
6
|
$ bash -x example_script.sh
+ echo 'Hello chenhao,'
Hello chenhao,
++ date +%Y-%m-%d
+ echo 'Today is 2009-08-31'
Today is 2009-08-31
|
这时,我们可以看到,bash在运行前打印出了每一行命令。而且每行前面的+号表明了嵌套。这样的输出可以让你看到命令执行的顺序并可以让你知道整个脚本的行为。
在跟踪里输出行号
在一个很大的脚本中,你会看到很多很多的执行跟踪的输出,阅读起来非常费劲,所以,你可以在每一行前加上文件的行号,这会非常有用。要做到这样,你只需要设置下面的环境变量:
1
2
|
export PS4= '+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
|
让我们看看设置上了PS4这个环境变量后会是什么样的输出。
1
2
3
4
5
6
|
$ bash -x example_script.sh
+example_script.sh:2:: echo 'Hello chenhao,'
Hello chenhao,
++example_script.sh:3:: date +%Y-%m-%d
+example_script.sh:3:: echo 'Today is 2009-08-31'
Today is 2009-08-31
|
调试部份的脚本
有些时候,你并不想调试整个脚本,你只要调试其中的一部份,那么,你可以在你想要调试的脚本之前,调用“set -x”,结束的时候调用“set +x”就可以了。如下面的脚本所示:
1
2
3
4
5
|
#!/bin/bash
echo "Hello $USER,"
set -x
echo "Today is $(date %Y-%m-%d)"
set +x
|
让我们看看运行起来是啥样?
1
2
3
4
5
6
|
$ . /example_script .sh
Hello chenhao,
++example_script.sh:4:: date +%Y-%m-%d
+example_script.sh:4:: echo 'Today is 2009-08-31'
Today is 2009-08-31
+example_script.sh:5:: set +x
|
注意:我们在运行脚本的时候,不需要使用bash -x了。
日志输出
跟踪日志有时候太多了,多得都受不了,而且,输出的内容很难阅读。一般来说,我们很多时候只关心于条件表达式,变量值,或是函数调用,或是循环等。。在这种情况下,log一些感兴趣的特定的信息,可能会更好。
使用log前,我们先写一个函数:
1
2
3
4
5
|
_log() {
if [ "$_DEBUG" == "true" ]; then
echo 1>&2 "$@"
fi
}
|
于是,你就可以在你的脚本中如下使用:
1
2
3
|
_log "Copying files..."
cp src/* dst/
|
我们可以看到,上面那个_log函数,需要检查一个_DEBUG 变量,只有这个变量是真,才会真正开发输出日志。这样,你就只需要控制这个开关,而不需要删除你的debug信息。
1
2
|
$ _DEBUG= true . /example_script .sh
|
使用Bash专用调试器
如果你在写一个相当复杂的脚本,并且,你需要一个完整的像调试别的语言一样的调试器,那么你可以试着用用这个开源软件—— bashdb, 一个Bash的专用调试器。这个调试器很强大,你想得到的功能,他都有,比如,设置断点,单步跟踪,跳出函数,等等。它的用户接口很想GDB,这是他的文档 。
【转】如何调试bash脚本相关推荐
- 如何调试bash脚本
http://coolshell.cn/articles/1379.html Bash 是Linux操作系统的默认Shell脚本.Shell是用来处理操作系统和用户交互的一个程序.Shell的脚本可以 ...
- 简单调试 Bash 脚本
用 Bash 写的脚本也可以进行调试,和 Python,Perl 等解释型语言一样.新建一个名为 servinfo 的脚本并增加可执行权限: $ vi servinfo#!/bin/bashecho ...
- linux刷命令脚本,linux – 如何调试bash脚本并获得每个命令的执行时间
这是尽可能接近内置bash调试工具的答案,因为它从脚本执行开始时间提供了整体时序信息. 在脚本的顶部添加此项以进行第二次计数: export PS4='+[${SECONDS}s][${BASH_SO ...
- 使用VScode调试与编写bash脚本
有时bash脚本会被混淆,或者脚本中变量比较多的时候,用调试工具就会方便又美观,而Linux平台为数不多的调试工具中比较卓越的就是Vscode调试平台. 使用vscode调试linux bash时,b ...
- linux如何调试脚本文件目录,如何在Linux下调试Bash Shell脚本的方法
新手写了一个 hello world 小脚本,如何能调试运行在 Linux 或者类 UNIX 的系统上的 bash shell 脚本呢? 这是 Linux / Unix 系统管理员或新用户最常问的问题 ...
- linux的逻辑运算参数,Linux基础之bash脚本编程初级-逻辑运算与测试
引言 前面介绍了bash编程的基础变量与算术表达式,本文介绍在脚本中的进阶知识:测试 在bash中测试大体分两部分:条件测试.组合测试. 而条件测试又分:数值测试.字符串测试.文件测试. 组合测试则有 ...
- bash脚本编程之for循环
bash脚本编程: shell: 交互式接口:编程环境:能够提供一些内部命令,并且能通过PATH环境变量找到外部命令:把命令提交给内核启动为进程:默认字符型: 条件测试:$? 命令的状态结果 真( 0 ...
- 防止删库悲剧发生,这里有个Bash脚本测试框架,危险代码一测便知
萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 想要清理文件夹内部分冗余文件,结果误删了同事刚合的代码? (例如,在rm -rf /usr/bin/test的/usr后面加了个空格,结果 ...
- linux脚本里调执行命令,使用shell的-n/-x/-x执行选项调试Shell脚本
我们在前面介绍的调试手段是通过修改shell脚本的源代码,从其输出相关的调试信息来定位错误的,那有没有不修改源代码来调试shell脚本的方法呢?有的,那就是使用shell的执行选项,下面将介绍一些常用 ...
- Bash 脚本 set 命令教程
http://www.ruanyifeng.com/blog/2017/11/bash-set.html set命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题.本文介 ...
最新文章
- javascript 2
- 第十六届全国大学生智能汽车竞赛航天智慧物流总决赛暨第二届“航天杯”移动机器人AI创新技术挑战赛圆满举办
- pandas rolling方法_【干货】pandas相关工具包
- jupyter notebook保存的文件在哪_通过配置文件修改jupyter notebook初始文件夹
- 封装算法: 模板方法(Template Method)模式
- 如何用计算机制作公式,常用的那些软件能做公式编辑器
- ACL2021 | 没想到Mixup还可以用于文本:SSMix
- python开根_python如何开根号
- 红警2 技术篇 地图基础ini 教程
- [SAP ABAP开发技术总结]增强Enhancement
- LoadRunner 常用函数大全+1
- cadence schematic composer/ADE virtuoso IC61 怎么样修改器件annotation
- JAVA对接短信通知接口
- kafka 0.10.0.0 版本
- 校园歌手信息评分系统(C语言),大一新生期末实训
- 高德地图看各省分界线_高德地图定位城市区域
- element UI 修改 table 中某一列的值
- TreeMap、二叉树
- 读懂消费贷款之中国消费金融发展史
- 生化危机4(来生/恶灵古堡IV)DVD/700M发布
热门文章
- paip.eclipse忽然启动报错的解决
- 2017:社保再选管理人基金公司争“主力”
- 【数字信号调制】基于matlab正交幅度调制仿真【含Matlab源码 1002期】
- 【图像修复】基于matlab GUI空域滤波图像复原【含Matlab源码 849期】
- 【路径规划】基于matlab果蝇优化算法机器人路径规划【含Matlab源码 677期】
- 【路径规划】基于matlab GUI D_star算法最短路径规划【含Matlab源码 634期】
- 【人脸表情识别】基于matlab PCA+SVM人脸表情识别评分系统【含Matlab源码 593期】
- 傅里叶变换对照表_傅里叶分析推导
- 智能机器人机器人心得_如果机器人说到上帝
- C语言编写——四则运算小游戏