15

在执行 shell 脚本时,如何知道它正在执行的行号,确实编写了一个包装器,我可以在其中从 shell 脚本执行 shell 脚本并知道它正在执行的行号。

4

3 回答 3

21

您可以设置PS4变量以使set -x输出包含行号:

PS4=':${LINENO}+'
set -x

这将在执行时将行号放在每行之前:

:4+command here
:5+other command

+在变量扩展之后有一些符号字符(例如我的示例中的 a )很重要PS4,因为最后一个字符会重复以显示嵌套深度。也就是说,如果您调用一个函数,并且该函数调用一个命令,则输出set -x将像这样报告它:

:3+++command run within a function called from a function
:8++command run within a function
:19+line after the function was called

如果运行脚本涉及多个文件,您可能希望包含BASH_SOURCE变量而不是仅包含变量LINENO(假设这确实是一个 bash 脚本,而不是/bin/sh-- 确保您的脚本以#!/bin/bash! 开头):

PS4=':${BASH_SOURCE}:${LINENO}+'
set -x
于 2012-05-30T11:22:15.400 回答
6

Bash 有一个特殊的变量$LINENO可以做你想做的事。

#!/bin/bash
echo "$LINENO"
echo "$LINENO"
echo "$LINENO"

演示:

$ ./lineno
2
3
4
于 2012-05-30T11:17:13.110 回答
5
#!/bin/sh -x

将在执行时报告这些行(-x要明确的选项)。它不会给您行号,但会报告实际行。

另一种但更痛苦的方法是使用陷阱处理程序,如此所述。

于 2012-05-30T09:51:46.473 回答