linux – Bash陷阱:如何获取具有非零状态的子进程的行号
发布时间:2020-12-13 22:44:45 所属栏目:Linux 来源:网络整理
导读:对于 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[*]}' ERR11 12 set -e13 set -E14 set -o errtrace15 shopt -s extdebug16 17 local -
对于
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)感兴趣. 是否可以获取返回非零状态的子进程的行号?如果不可能,是否有任何相关的文件?如果存在解决方案,则应该在代码中没有不必要的修饰的情况下进行扩展 解决方法#!/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 也许我错过了一些东西,但也许这对你有用…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |