从陷阱处理程序(使用调用者)获取bash中的函数回溯

从陷阱处理程序(使用调用者)获取bash中的函数回溯,bash,error-handling,bash-trap,Bash,Error Handling,Bash Trap,我知道您可以使用“caller”在bash中获取函数调用的回溯: #! /bin/bash Backtrace () { echo "Backtrace is:" i=0 while caller $i do i=$((i+1)) done } myFunc () { Backtrace } myFunc 印刷品: Backtrace is: 11 myFunc ./test.sh 13 main ./test.sh 我的问题是,假设我有一个脚

我知道您可以使用“caller”在bash中获取函数调用的回溯:

#! /bin/bash
Backtrace () {
   echo "Backtrace is:"
   i=0
   while caller $i
   do
      i=$((i+1))
   done
}
myFunc () {
   Backtrace
}
myFunc
印刷品:

Backtrace is:
11 myFunc ./test.sh
13 main ./test.sh
我的问题是,假设我有一个脚本,它使用“set-e”在任何未检查的失败时终止。是否可以获取脚本失败的行号(及其调用者)


我曾经天真地尝试过这样做:trap'Backtrace'EXIT,但这给了我'1 main./test.sh',而不是失败命令的行号

我不确定它是否有效,但尝试将
ERR
添加到
trap
'd信号列表中。也许你的代码会在
set-e
东西接管之前被调用,在这种情况下你会重新开始工作。

如果陷阱是非零返回代码造成的,你可以通过捕获SIGCHLD并检查
$来解决这个问题-等式0

这样做的缺点是,每当子进程返回时,陷阱就会触发。但您可以使用
[[$?-eq 0]]返回值短路

有关更多详细信息,请参阅

对不起,如果我误解了你的问题,希望这是有帮助的。我知道您的问题不是针对SIGSEGV的,但它适用于任何时间
set-e
由于非零状态代码而导致退出,因此应该仍然适用

编辑:为了省去悬念,为了诱捕SIGCHLD,你可以使用
trap-CHLD
,而不是像大多数通情达理的人所认为的那样使用
trap-SIGCHLD