dsp*_*pjm 72 linux testing bash
我里面有很多的命令,并会产生大量输出的测试脚本,我使用set -x
或set -v
和set -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)
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)
在相当复杂的脚本中,我不希望看到所有行号;相反,我想控制输出。
定义一个函数
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
。
还有什么要补充的吗?
当然。为什么需要这个?你如何处理这个问题?你能用这个做什么?这种简单的方法真的足够或有用吗?你为什么要修改这个呢?
想知道更多?阅读调试反思