我有一个测试脚本,其中有很多命令,并将生成大量输出,我使用set -x或set -v和set -e,所以脚本将停止时,错误发生。但是,我还是很难找到执行停止的那一行来定位问题,有没有一个方法可以在每一行执行之前输出脚本的行号?或者在set -x生成的命令展示之前输出行号?或者任何可以处理我的脚本行位置问题的方法都会有很大的帮助。谢谢。
set -x
set -v
set -e
wpx232ag1#
您提到您已经在使用-x,变量PS4表示该值是在设置-x选项时命令行回显之前打印的提示符,默认值为:后跟空格。您可以更改PS4以发出LINENO(当前执行的脚本或shell函数中的行号)。例如,如果您的脚本为:
-x
PS4
:
LINENO
$ 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]}(): }'
bvjveswy2#
在Bash中,$LINENO包含脚本当前执行的行号。如果你需要知道函数被调用的行号,试试$BASH_LINENO。注意这个变量是一个数组。例如:
$LINENO
$BASH_LINENO
#!/bin/bash function log() { echo "LINENO: ${LINENO}" echo "BASH_LINENO: ${BASH_LINENO[*]}" } function foo() { log "$@" } foo "$@"
有关Bash变量的详细信息,请参见here。
hc8w905p3#
价值$LINENO的PS4是你所需要的,例如,以下脚本(myScript.sh):
#!/bin/bash -xv PS4='${LINENO}: ' echo "Hello" echo "World"
输出为:
./myScript.sh +echo Hello 3 : Hello +echo World 4 : World
pb3skfrl4#
在一个相当复杂的脚本中,我不希望看到所有的行号;我宁愿控制输出。定义函数
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脚本时显示行号的问题。还有什么要补充的吗?当然。你为什么需要它?你如何使用它?你能用它做什么?这个简单的方法真的足够或有用吗?你为什么要修补它呢?想要了解更多?阅读调试反思
gk7wooem5#
简单(但功能强大)的解决方案:将echo放在您认为导致问题的代码周围,并逐行移动echo,直到屏幕上不再出现消息-因为脚本已因之前的错误而停止。更强大的解决方案:安装bash调试器bashdb并逐行调试脚本
echo
bashdb
lokaqttq6#
如果在函数中使用$LINENO,它将缓存第一个匹配项。
6条答案
按热度按时间wpx232ag1#
您提到您已经在使用
-x
,变量PS4
表示该值是在设置-x
选项时命令行回显之前打印的提示符,默认值为:
后跟空格。您可以更改
PS4
以发出LINENO
(当前执行的脚本或shell函数中的行号)。例如,如果您的脚本为:
因此,执行该命令将打印行号:
http://wiki.bash-hackers.org/scripting/debuggingtips提供了最终的
PS4
,它将输出跟踪所需的一切:bvjveswy2#
在Bash中,
$LINENO
包含脚本当前执行的行号。如果你需要知道函数被调用的行号,试试
$BASH_LINENO
。注意这个变量是一个数组。例如:
有关Bash变量的详细信息,请参见here。
hc8w905p3#
价值$LINENO的PS4是你所需要的,
例如,以下脚本(myScript.sh):
输出为:
pb3skfrl4#
无LINENO shell 的变通方案
在一个相当复杂的脚本中,我不希望看到所有的行号;我宁愿控制输出。
定义函数
与以下引号一起使用
输出为
如果该行在源文件中的行号是16。
这基本上回答了在没有
LINENO
的情况下,如何在为ash或其他shell的用户执行bash脚本时显示行号的问题。还有什么要补充的吗?
当然。你为什么需要它?你如何使用它?你能用它做什么?这个简单的方法真的足够或有用吗?你为什么要修补它呢?
想要了解更多?阅读调试反思
gk7wooem5#
简单(但功能强大)的解决方案:将
echo
放在您认为导致问题的代码周围,并逐行移动echo
,直到屏幕上不再出现消息-因为脚本已因之前的错误而停止。更强大的解决方案:安装bash调试器
bashdb
并逐行调试脚本lokaqttq6#
如果在函数中使用
$LINENO
,它将缓存第一个匹配项。