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

时间:2012-05-30 09:50:12

标签: bash shell

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

3 个答案:

答案 0 :(得分:21)

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

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

这将在执行每行之前输入行号:

:4+command here
:5+other command

+中的变量扩展之后,有一些符号字符(例如我的示例中的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

答案 1 :(得分:6)

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

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

演示:

$ ./lineno
2
3
4

答案 2 :(得分:5)

#!/bin/sh -x

将在执行时报告行(-x选项,以便明确)。它不会为您提供行号,但会报告实际行。

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