Shell 脚本调试的主要工作是发现脚本的错误的原因,以及定位脚本中发生错误的行。Bash 提供了多种脚本调试的功能。但是比较常用的是使用 Bash 的 -x 选项启动一个子 Shell,它将以调试模式运行整个脚本,使 Shell 在执行脚本的过程中把实际执行的每一个命令行显示出来,并且在命令行的行首显示一个 “+” 号,“+” 号后面显示的是经过了参数扩展的命令行的内容。这将有助于分析实际执行的是什么命令。
Bash 的执行选项还可以在脚本中通过 let 命令来指定。“set -选项”表示启动某选项,“set +选项”表示关闭某选项。所以我们可以在 Shell 脚本中使用 “set -x” 和 “set +x” 命令来调试脚本中的某一段代码。
Bash 中还有一个 “-v” 选项,该选项将激活详细输出模式,在这一模式中,由 Bash 读入的每一行命令都将在执行前被打印,包括注释行。
定制输出信息
$LINENO —— Bash 内部环境变量,表示 Shell 脚本的当前行号。
$FUNCNAME —— Bash 内部环境变量,它是一个包含了当前在执行调用堆栈中的所有 Shell 函数名称的数组变量。${FUNCNAME[0]} 代表当前正在执行的 Shell 函数的名称,${FUNCNAME[1]} 则代表调用函数
${FUNCNAME[0]} 的函数的名字,依次类推。
$PS4 —— Bash 内部环境变量,在使用 Bash 的 -x 选项时,每一条实际执行的命令的行首会显示一个 “+” 号,这个 “+” 号其实就是变量 $PS4 的默认值。
利用 $PS4 变量,再结合 $LINENO 和 $FUNCNAME 两个内部变量,通过重新定义变量 $PS4,可以增强 -x 选项的输出信息。我们可以在执行脚本之前先执行下面的语句:
export PS4=`+{$LINENO:${FUNCNAME[0]}}`
使用示例:
定制输出信息
Bash 中还有一个执行选项 -n,他可以用于测试 Shell 脚本中是否存在语法错误,它会读取脚本中的命令行但是不会执行它们。
本文参考自 《Linux Shell命令行及脚本编程实例详解 》
网友评论