对于 Bash 程序:
1 #!/bin/bash
2
3 trapinfo()
4 {
5 echo "=== Trap Info: Status=$? LINENO=$@ A=$A"
6 }
7
8 main()
9 {
10 trap 'trapinfo $LINENO -- ${BASH_LINENO[*]}' ERR
11
12 set -e
13 set -E
14 set -o errtrace
15 shopt -s extdebug
16
17 local -g A=1
18
19 # false # If uncommented, LINENO would be 19
20 (exit 73) # LINENO is 9. How can I get 20 instead?
21
22 A=2
23 }
24
25 main
输出:
=== Trap Info: Status=73 LINENO=9 -- 25 0 A=1
我正在寻找一种方法来获得它,以便以非零状态退出的子shell被捕获trap
并显示失败子shell的行号。在上面的示例中,我正在寻找第 20 行作为结果。我注意到如果错误不在子 shell 中,我会得到想要的行号(见false
上文)。
我尝试将陷阱移动到子shell 之前以检查行号9
是否实际连接到陷阱调用,但我得到了相同的结果。我还尝试将set
andshopt
条目也放入子外壳中——同样没有改变行为。
环境:
- bash-4.2.46-21.el7_3.x86_64:这是一项要求,但不要求符合 POSIX。我也对后来的 Bash 版本(4.2+)感兴趣。
- CentOS 7+:虽然主要对 CentOS 感兴趣,但我最终将需要它用于部署在 Ubuntu 16.04+ 和 CentOS 6 上的 Bash 脚本。
是否可以获得返回非零状态的子进程的行号?如果不可能,是否有任何文件可以证明这一点?如果存在解决方案,它应该可以很好地扩展,而无需在代码中进行不必要的修饰。