天天看点

Bash技巧:使用 set 内置命令帮助调试 shell 脚本

在 bash 中,可以使用 ​

​set​

​ 内置命令设置和查看 shell 的属性。

这些属性会影响 shell 的不同行为。

下面对一些常用的属性进行说明。

set 命令

查看 help set 对 ​

​set​

​ 命令的说明如下:

set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]Change the value of shell attributes and positional parameters, or display the names and values of shell variables.

Using + rather than - causes these flags to be turned off.

即,​

​set​

​ 命令后面可以跟着要设置的 shell 属性选项。

如果选项以 ​

​-​

​ 开头,则是设置为打开该选项。

​+​

​ 开头,则是设置为关闭该选项。

使用 set -e 选项在遇到报错后停止执行

查看 help set 命令,对 ​

​-e​

​ 选项说明如下:

-eExit immediately if a command exits with a non-zero status.

​set -e​

​ 会在遇到任何非 0 的命令返回值时,退出所在的 shell。

在脚本开头 ​

​#!/bin/bash​

​ 语句的下一行添加 ​

​set -e​

​ 语句,那么执行该脚本时,执行过程中遇到的任何错误都会终止脚本,可以避免执行后续的脚本语句。

具体举例说明如下:

#!/bin/bash
set -e      

从编程的角度来说,​

​set -e​

​ 选项的作用跟C语言的 assert() 函数类似,遇到错误就停止。

在调试 shell 脚本时,如果遇到某个不预期的错误,就可以使用这个选项让脚本及时停止运行,以便找到最接近出错位置的语句。

使用 set -x 选项打开调试开关

​-x​

-xPrint commands and their arguments as they are executed.

​set -x​

​ 会打印具体执行的命令、以及命令的参数。

这些参数是经过 bash 扩展后的参数,可以方便看到的各个变量值扩展后的结果是什么、某个变量是否扩展为空导致参数个数发生变化,等等。

如前面说明,把选项开头的 ​

​-​

​ 改成 ​

​+​

​ 会关闭选项,​

​set +x​

​ 命令关闭调试开关。

具体举例如下:

$ set -x
$ ls test*
+ ls --color=auto testcase.sh testfile
$ set +x      

这里先执行 ​

​set -x​

​ 命令打开调试开关。

然后执行 ​

​ls test*​

​ 命令,可以看到扩展后的命令为 ​

​ls --color=auto testfile testcase.sh​

​。

从扩展后的结果可以看到 ​

​test*​

​ 被扩展为当前目录下以 "test" 开头的文件名,有助于理解 ​

​*​

​ 通配符的扩展结果。

可以使用类似于下面的语句在 shell 脚本中设置该选项:

#!/bin/bash
set -x      

在学习 bash 通配符、各个扩展表达式时,​

​set -x​

​ 可以打印出具体的扩展结果,便于理解。

使用 set -v 回显所输入的命令

​-v​

-vPrint shell input lines as they are read.

​set -v​

​ 选项会回显所输入的命令。

跟 ​

​set -x​

​ 的区别在于,​

​set -x​

​ 显示的是扩展后的结果,而 ​

​set -v​

​ 显示的是所输入的命令自身。

$ set -v
$ ls test*
ls test*
testcase.sh  testfile      

可以看到,设置 ​

​set -v​

​ 选项后,执行 ​

​ls test*​

​ 命令,回显的内容就是 "ls test*"。

继续阅读