从陷阱处理程序(使用调用者)获取bash中的函数回溯
我知道您可以使用“caller”在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 我的问题是,假设我有一个脚
#! /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
)