如何在执行bash脚本时显示行号
我有一个testing脚本,它有很多的命令,并会产生大量的输出,我使用set -x
或set -v
和set -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脚本