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

时间:2013-07-23 07:31:24

标签: linux bash testing

我有一个测试脚本,它有很多命令并会生成大量输出,我使用set -xset -vset -e,因此脚本会在发生错误时停止。但是,我仍然很难找到执行停止的哪一行以找到问题。 是否有一种方法可以在执行每一行之前输出脚本的行号? 或者在set -x生成的命令展览之前输出行号? 或任何可以处理我的脚本行位置问题的方法将是一个很大的帮助。 感谢。

5 个答案:

答案 0 :(得分:121)

您提到您已使用-x。变量PS4表示值是在设置-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]}(): }'

答案 1 :(得分:25)

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

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

例如:

#!/bin/bash       

function log() {
    echo "LINENO: ${LINENO}"
    echo "BASH_LINENO: ${BASH_LINENO[*]}"
}

function foo() {
    log "$@"
}

foo "$@"

有关Bash变量的详细信息,请参阅here

答案 2 :(得分:1)

价值 $LINENO 的 PS4 正是您所需要的,

例如以下脚本(myScript.sh):

       #!/bin/bash -xv
       PS4='${LINENO}: '
       echo "Hello"
       echo "World"

输出将是:

  ./myScript.sh
  +echo Hello
  3 : Hello
  +echo World
  4 : Hello

答案 3 :(得分:0)

简单(但功能强大)的解决方案:将echo放在您认为导致问题的代码周围并逐行移动echo,直到消息不再出现在屏幕上 - 因为脚本已经因为之前的错误而停止。

更强大的解决方案:安装bashdb bash调试器并逐行调试脚本

答案 4 :(得分:0)

没有LINENO

的shell的解决方法

在一个相当复杂的脚本中,我不希望看到所有的行号;相反,我想控制输出。

定义一个函数

echo_line_no () {
    grep -n "$1" $0 |  sed "s/echo_line_no//" 
    # grep the line(s) containing input $1 with line numbers
    # replace the function name with nothing 
} # echo_line_no

之类的引号一起使用
echo_line_no "this is a simple comment with a line number"

输出

16   "this is a simple comment with a line number"

如果源文件中此行的编号为16.

对于没有LINENO的灰烬或其他贝壳的用户,这基本上回答了问题How to show line number when executing bash script

还有什么要补充的吗?

不确定。你为什么需要这个?你是如何使用这个的?你能用这个做什么?这种简单的方法真的足够或有用吗?你为什么要修补这个?

想知道更多? Read reflections on debugging