在执行shell脚本时,如何知道它正在执行哪一行?是否需要编写一个包装器,在其中可以从shell脚本中执行另一个shell脚本,并知道它正在执行哪一行。
你可以设置 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
$LINENO
,可以实现你所需的功能。#!/bin/bash
echo "$LINENO"
echo "$LINENO"
echo "$LINENO"
示例:
$ ./lineno
2
3
4
man bash
却说:“PS4的第一个字符会根据需要重复多次,以指示多个间接级别。” - Lucian Wischik