如何在执行bash脚本时显示行号

我有一个testing脚本,它有很多的命令,并会产生大量的输出,我使用set -xset -vset -e ,所以脚本会在发生错误时停止。 但是,要确定哪个线路执行停止以find问题还是很困难的。 有没有一种方法可以在每行执行之前输出脚本的行号? 或者在set -x生成的命令展示之前输出行号? 或者任何可以处理我的脚本行位置问题的方法将是一个很大的帮助。 谢谢。

你提到你已经在使用-x 。 variablesPS4表示该值是在设置-x选项时回显命令行之前打印的提示符,默认值为:后跟空格。

您可以更改PS4以发出LINENO (脚本中的行号或当前正在执行的shell函数)。

例如,如果您的脚本显示为:

 $ cat script foo=10 echo ${foo} echo $((2 + 2)) 

执行它将打印行号:

 $ PS4='Line ${LINENO}: ' bash -x script Line 1: foo=10 Line 2: echo 10 10 Line 3: echo 4 4 

http://wiki.bash-hackers.org/scripting/debuggingtips提供了最终的PS4 ,将输出您可能需要跟踪的一切:

 export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' 

在Bash中, $LINENO包含当前正在执行的脚本的行号。

如果您需要知道函数调用的行号,请尝试$BASH_LINENO 。 请注意,这个variables是一个数组。

例如:

 #!/bin/bash function log() { echo "LINENO: ${LINENO}" echo "BASH_LINENO: ${BASH_LINENO[*]}" } function foo() { log "$@" } foo "$@" 

有关Bashvariables的详细信息,请参阅此处 。

简单(但function强大)的解决scheme:在你认为会导致问题的代码周围放置echo ,并逐行移动echo ,直到消息不再出现在屏幕上 – 因为之前的脚本已经停止。

更强大的解决scheme:安装bashdb bashdebugging器并逐行debugging脚本