7

我知道您可以使用“调用者”来回溯 b​​ash 中的函数调用:

#! /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' 而不是失败命令的行号

4

2 回答 2

4

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

于 2011-04-27T22:09:18.097 回答
0

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

这样做的缺点是,只要子进程返回,陷阱就会触发。但是你可以只用短路[[ $? -eq 0 ]] return

有关更多详细信息,请参阅陷阱无法捕获 SIGSEGV

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

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

于 2021-01-03T23:34:53.877 回答