电脑技术学习

对话 UNIX: 更多 shell 脚本技术

dn001

  在执行这个脚本之前,把 PS4 变量改为某个看起来醒目的字符串:

# export PS4="DEBUG => "

  接下来,执行这个脚本,就会看到可能非常有价值的信息,见清单 13。

  清单 13. set -x 的输出

# ./make_errors
DEBUG => _X=1
DEBUG => [[ 1 -le 4 ]]
DEBUG => [[ 1 -lt 2 ]]
DEBUG => echo 'X is less than 2!'
X is less than 2!
DDEBUG => expr 1 + 1
DEBUG => _Y=2
DEBUG => [[ 2 -eq 3 ]]
DEBUG => _X=2
DEBUG => [[ 2 -le 4 ]]
DEBUG => [[ 2 -lt 2 ]]
DDEBUG => expr 2 + 1
DEBUG => _Y=3
DEBUG => [[ 3 -eq 3 ]]
DEBUG => echo 'Y is now equal to 3'
Y is now equal to 3
DEBUG => _X=3
DEBUG => [[ 3 -le 4 ]]
DEBUG => [[ 3 -lt 2 ]]
DDEBUG => expr 3 + 1
DEBUG => _Y=4
DEBUG => [[ 4 -eq 3 ]]
DEBUG => _X=4
DEBUG => [[ 4 -le 4 ]]
DEBUG => [[ 4 -lt 2 ]]
DDEBUG => expr 4 + 1
DEBUG => _Y=5
DEBUG => [[ 5 -eq 3 ]]
DEBUG => _X=5
DEBUG => [[ 5 -le 4 ]]

  可以看到这里有大量信息:处理并执行的每个命令都显示出来了。还要注意,在调试信息中没有显示 shell 脚本中的注释。这是因为 shell 在读取注释之后并不执行它。还好,在完成前面的修改之后,这个脚本没有错误了!

  在使用 set -x 时还要记住一点:如果脚本有内部函数,而且 set -x 放在代码的主体部分,那么它的输出会包含子函数的运算过程。但是,如果 set -x 只放在内部函数中,那么 debug 选项的影响范围只包含这个内部函数中的代码和在其中调用的子函数;shell 脚本的主体并不包含在内,这是因为它不知道它的内部函数会调用这个例程。

  结束语

  无论是使用 shell 脚本、C、Java™ 语言或其他语言,我们都在不断地改进编程方法。坚持简单化的基本规则,保持代码简洁灵活,给代码加上适当的注释,再借助调试工具的帮助,您很快就能编写出出色的 shell 脚本。祝您好运!

标签: