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

e1xvtsh3  于 2023-01-16  发布在  Linux
关注(0)|答案(6)|浏览(302)

我有一个测试脚本,其中有很多命令,并将生成大量输出,我使用set -xset -vset -e,所以脚本将停止时,错误发生。但是,我还是很难找到执行停止的那一行来定位问题,有没有一个方法可以在每一行执行之前输出脚本的行号?或者在set -x生成的命令展示之前输出行号?或者任何可以处理我的脚本行位置问题的方法都会有很大的帮助。谢谢。

wpx232ag

wpx232ag1#

您提到您已经在使用-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]}(): }'
bvjveswy

bvjveswy2#

在Bash中,$LINENO包含脚本当前执行的行号。
如果你需要知道函数被调用的行号,试试$BASH_LINENO。注意这个变量是一个数组。
例如:

#!/bin/bash       

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

function foo() {
    log "$@"
}

foo "$@"

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

hc8w905p

hc8w905p3#

价值$LINENO的PS4是你所需要的,
例如,以下脚本(myScript.sh):

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

输出为:

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

pb3skfrl4#

无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的情况下,如何在为ash或其他shell的用户执行bash脚本时显示行号的问题。
还有什么要补充的吗?
当然。你为什么需要它?你如何使用它?你能用它做什么?这个简单的方法真的足够或有用吗?你为什么要修补它呢?
想要了解更多?阅读调试反思

gk7wooem

gk7wooem5#

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

lokaqttq

lokaqttq6#

如果在函数中使用$LINENO,它将缓存第一个匹配项。

相关问题