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

时间:2011-04-27 21:46:10

标签: 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

我的问题是,假设我有一个脚本使用'set -e'终止任何未经检查的失败。是否有可能获得脚本失败的行号(及其调用者)

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

如果陷阱是非零返回码的结果,您可以通过捕获 SIGCHLD 并检查是否 $? -eq 0

这样做的缺点是陷阱会在子进程返回时触发。但是你可以用 [[ $? -eq 0 ]] return

短路

有关详细信息,请参阅 trap fails to catch SIGSEGV

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

编辑:为了避免悬念,为了捕获 SIGCHLD,您使用 trap <expression> CHLD,而不是大多数合理的人假设的 trap <expression> SIGCHLD :)