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

dsp*_*pjm 72 linux testing bash

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

dev*_*ull 131

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

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

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

$ cat script
foo=10
echo ${foo}
echo $((2 + 2))
Run Code Online (Sandbox Code Playgroud)

因此执行它将打印行号:

$ PS4='Line ${LINENO}: ' bash -x script
Line 1: foo=10
Line 2: echo 10
10
Line 3: echo 4
4
Run Code Online (Sandbox Code Playgroud)

http://wiki.bash-hackers.org/scripting/debuggingtips提供了最终PS4输出您可能需要跟踪的所有内容:

export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
Run Code Online (Sandbox Code Playgroud)

  • `\033[0;33m+(${BASH_SOURCE}:${LINENO}):\033[0m ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'` 一些颜色 (3认同)
  • 我想知道为什么没有人提到"如何调试shell脚本?" .这远远好于`echo` (2认同)
  • 我不禁觉得`-x`*应该*打印行号.或者,也许-`nx`*应该*包括行号.对我来说,这是其中一个"WTF"时刻...... (2认同)

Deq*_*ing 29

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

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

例如:

#!/bin/bash       

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

function foo() {
    log "$@"
}

foo "$@"
Run Code Online (Sandbox Code Playgroud)

有关Bash变量的详细信息,请参见此处.


Luc*_*Luc 10

价值$LINENO的PS4就是你所需要的,

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

       #!/bin/bash -xv
       PS4='${LINENO}: '
       echo "Hello"
       echo "World"
Run Code Online (Sandbox Code Playgroud)

输出将是:

  ./myScript.sh
  +echo Hello
  3 : Hello
  +echo World
  4 : World
Run Code Online (Sandbox Code Playgroud)


kkl*_*per 5

没有 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
Run Code Online (Sandbox Code Playgroud)

将其与引号一起使用,例如

echo_line_no "this is a simple comment with a line number"
Run Code Online (Sandbox Code Playgroud)

输出是

16   "this is a simple comment with a line number"
Run Code Online (Sandbox Code Playgroud)

如果源文件中该行的行数是16。

这基本上回答了如何为 ash 或其他没有 .shell 的用户执行 bash 脚本时显示行号的问题LINENO

还有什么要补充的吗?

当然。为什么需要这个?你如何处理这个问题?你能用这个做什么?这种简单的方法真的足够或有用吗?你为什么要修改这个呢?

想知道更多?阅读调试反思