追踪
错误通常是脚本中意外逻辑流的情况。 也就是说,脚本的某些部分要么永远不会执行,要么以错误的顺序或在错误的时间执行。 为了查看程序的实际流程,我们使用了一种称为 追踪.
一种跟踪方法涉及在显示执行位置的脚本中放置信息性消息。 我们可以向我们的代码片段添加消息:
echo "准备删除文件" >&2
如果 [[ -d $dir_name ]]; 那么如果 cd $dir_name; 然后
echo "删除文件" >&2
R M *
其他
echo "无法 cd 到 '$dir_name'" >&2 exit 1
其他
echo "没有这样的目录:'$dir_name'" >&2 exit 1
fi
echo "文件删除完成" >&2
echo "准备删除文件" >&2
如果 [[ -d $dir_name ]]; 那么如果 cd $dir_name; 然后
echo "删除文件" >&2
R M *
其他
echo "无法 cd 到 '$dir_name'" >&2 exit 1
其他
echo "没有这样的目录:'$dir_name'" >&2 exit 1
fi
echo "文件删除完成" >&2
我们将消息发送到标准错误以将它们与正常输出分开。 我们也不缩进包含消息的行,因此更容易找到何时需要删除它们。
现在执行脚本时,可以看到文件删除已经执行:
[me@linuxbox ~]$delete-script 准备删除文件删除文件
文件删除完成 [me@linuxbox ~]$
[me@linuxbox ~]$delete-script 准备删除文件删除文件
文件删除完成 [me@linuxbox ~]$
bash 还提供了一种跟踪方法,由 -x 选项和带有 -x 选项的 set 命令实现。 使用我们之前的故障脚本,我们可以通过在第一行添加 -x 选项来激活对整个脚本的跟踪:
#!/bin/bash -x
#!/bin/bash -x
调试
# 麻烦:演示常见错误的脚本 number=1
如果 [ $number = 1 ]; 然后
echo "数字等于 1。" 别的
echo "数字不等于 1。"
fi
# 麻烦:演示常见错误的脚本 number=1
如果 [ $number = 1 ]; 然后
echo "数字等于 1。" 别的
echo "数字不等于 1。"
fi
执行后,结果如下所示:
[我@linuxbox ~]$ 麻烦
+ 数字=1
+ '[' 1 = 1 ']'
+ echo '数字等于 1。' 数字等于 1。
[我@linuxbox ~]$ 麻烦
+ 数字=1
+ '[' 1 = 1 ']'
+ echo '数字等于 1。' 数字等于 1。
启用跟踪后,我们会看到应用扩展后执行的命令。 前导加号表示轨迹的显示,以将它们与常规输出的行区分开来。 加号是跟踪输出的默认字符。 它包含在 PS4 (提示字符串 4)shell 变量。 可以调整此变量的内容以使提示更有用。 在这里,我们修改变量的内容以在执行跟踪的脚本中包含当前行号。 请注意,在实际使用提示之前,需要单引号以防止扩展:
[我@linuxbox ~]$ 导出 PS4='$LINENO + '
[我@linuxbox ~]$ 麻烦
5 + 数字=1
7 + '[' 1 = 1 ']'
8 + echo '数字等于 1。' 数字等于 1。
[我@linuxbox ~]$ 导出 PS4='$LINENO + '
[我@linuxbox ~]$ 麻烦
5 + 数字=1
7 + '[' 1 = 1 ']'
8 + echo '数字等于 1。' 数字等于 1。
要对脚本的选定部分而不是整个脚本执行跟踪,我们可以使用 集 用命令 -x 选项:
#!/斌/庆典
# 麻烦:演示常见错误的脚本 number=1
#!/斌/庆典
# 麻烦:演示常见错误的脚本 number=1
set -x # 开启追踪
如果 [ $number = 1 ]; 然后
echo "数字等于 1。" 别的
echo "数字不等于 1。"
fi
set +x # 关闭追踪
set -x # 开启追踪
如果 [ $number = 1 ]; 然后
echo "数字等于 1。" 别的
echo "数字不等于 1。"
fi
set +x # 关闭追踪
我们使用 集 用命令 -x 选项来激活跟踪和 +x 取消激活跟踪的选项。 此技术可用于检查麻烦脚本的多个部分。