linux – Bash陷阱:如何获取具有非零状态的子进程的行号

linux – Bash陷阱:如何获取具有非零状态的子进程的行号,第1张

概述对于 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 对于 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 -g A=118  19     # false        # If uncommented,liNENO would be 1920     (exit 73)      # liNENO is 9. How can I get 20 instead?21  22     A=223  }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/bashtrAPInfo(){   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

也许我错过了一些东西,但也许这对你有用……

总结

以上是内存溢出为你收集整理的linux – Bash陷阱:如何获取具有非零状态的子进程的行号全部内容,希望文章能够帮你解决linux – Bash陷阱:如何获取具有非零状态的子进程的行号所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1017319.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存