在执行shell脚本时,如何知道它正在执行哪个行号,

ani*_*ish 15 bash shell

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

Cha*_*ffy 21

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

PS4=':${LINENO}+'
set -x
Run Code Online (Sandbox Code Playgroud)

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

:4+command here
:5+other command
Run Code Online (Sandbox Code Playgroud)

+在变量扩展之后有一些sigil字符(例如我的例子中的一个)很重要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
Run Code Online (Sandbox Code Playgroud)

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

PS4=':${BASH_SOURCE}:${LINENO}+'
set -x
Run Code Online (Sandbox Code Playgroud)

  • 您说“重复最后一个字符以显示嵌套深度”,但 `man bash` 改为说“根据需要多次复制 PS4 的第一个字符,以指示多个间接级别。” (2认同)

Pau*_*ce. 6

Bash有一个特殊的变量可以满足$LINENO您的需求.

#!/bin/bash
echo "$LINENO"
echo "$LINENO"
echo "$LINENO"
Run Code Online (Sandbox Code Playgroud)

演示:

$ ./lineno
2
3
4
Run Code Online (Sandbox Code Playgroud)


Bri*_*new 5

#!/bin/sh -x
Run Code Online (Sandbox Code Playgroud)

将在执行时报告行(-x选项,要清楚).它不会给你行号,但报告实际行.

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