对于
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并显示失败的子shell的行号.在上面的例子中,我正在寻找第20行作为结果.我注意到如果错误不在子shell中,我确实得到了所需的行号(参见上面的错误).
我已经尝试将陷阱移动到子shell之前,以检查第9行是否实际连接到陷阱调用,但我得到了相同的结果.我也尝试将set和shopt条目放入子shell中 – 再次没有改变行为.
环境:
> bash-4.2.46-21.el7_3.x86_64:这是一项要求,但不要求POSIX合规性.我也对后来的Bash版本(4.2)感兴趣.
> CentOS 7:虽然主要对CentOS感兴趣,但我最终还是需要这个用于部署在Ubuntu 16.04和CentOS 6上的Bash脚本.
是否可以获取返回非零状态的子进程的行号?如果不可能,是否有任何相关的文件?如果存在解决方案,则应该在代码中没有不必要的修饰的情况下进行扩展
最佳答案
#!/bin/bash
trapinfo()
{
echo "=== Trap Info: Status=$? LINENO=$@ A=$A"
}
main()
{
trap 'trapinfo $LINENO $SAVE_IT -- ${BASH_LINENO[*]}' ERR
set -e
set -E
set -o errtrace
shopt -s extdebug
local -g A=1
# false # If uncommented, LINENO would be 19
SAVE_IT=$LINENO && (exit 73) # LINENO is magic, but a custom variable isn’t
A=2
}
main
也许我错过了一些东西,但也许这对你有用……