Linux Shell 脚本调试总结

Shell脚本是用户与Linux操作系统交互的一种方式,在脚本编程过程中自然少不了进行调试工作,本文将介绍三种常用的调试方法.(默认使用bash shell)


追踪脚本的执行

使用-x选项可以打印出脚本执行的每一行命令以及当前状态.
有如下脚本,打印数字1到10:

1
2
3
4
5
6
#!/bin/bash
for i in {1..10}
do
echo $i
done

我们使用-x选项进行调试如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#在每一行前加上行号
export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
#进行调试
sh -x test.sh
#调试结果
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 1
1
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 2
2
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 3
3
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 4
4
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 5
5
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 6
6
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 7
7
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 8
8
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 9
9
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 10
10

有时候,你只需要对脚本的一部分进行调试,那么可以使用如下命令:

1
2
3
4
set -x #在执行时显示参数和命令
set +x #禁止调试
set -v #当命令行读取时显示输入
set +v #禁止打印输入

可以使用set builtin来启用或者禁止调试打印.
对上文脚本做如下修改:

1
2
3
4
5
6
7
8
#!/bin/bash
for i in {1..10}
do
set -x
echo $i
set +x
done

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+test.sh:6:: echo 1
1
+test.sh:7:: set +x
+test.sh:6:: echo 2
2
+test.sh:7:: set +x
+test.sh:6:: echo 3
3
+test.sh:7:: set +x
+test.sh:6:: echo 4
4
+test.sh:7:: set +x
+test.sh:6:: echo 5
5
+test.sh:7:: set +x
+test.sh:6:: echo 6
6
+test.sh:7:: set +x
+test.sh:6:: echo 7
7
+test.sh:7:: set +x
+test.sh:6:: echo 8
8
+test.sh:7:: set +x
+test.sh:6:: echo 9
9
+test.sh:7:: set +x
+test.sh:6:: echo 10
10
+test.sh:7:: set +x

自定义日志

上面这种调试手段是bash内建的,而且输出格式固定而且繁琐.所以我们需要根据需要的信息,自定义格式来显示调试信息,通过设定_DEBUG环境变量来完成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# run:_DEBUG=on sh debug.sh
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@ || :
}
for i in {1..5}
do
DEBUG echo -e "This is debug line!"
echo $i
done

我们将_DEBUG环境变量设定为一个开关,只有打开时才会输出调试日志.
使用如上脚本结果如下:

1
2
3
4
5
6
7
8
9
10
11
[aidu1602@ResU10 tools]$ _DEBUG=on sh debug.sh
This is debug line!
1
This is debug line!
2
This is debug line!
3
This is debug line!
4
This is debug line!
5

这样我们就可以自定义调试信息,并且可以控制调试开关啦.

使用专用调试器

如果你需要调试一个非常复杂的脚本,并且需要一个及其专业的调试器,像GDB那样,那么我推荐这款开源的脚本调试器bashdb,具体使用可以参考它的文档.

About me

forthebadge

Creative Commons License This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。