外部命令转储核心后继续执行 shell 脚本

外部命令转储核心后继续执行 shell 脚本

我正在编写一个测试脚本来编译(通过 make)并运行一系列测试。我有一系列catgrepsed命令,可以很好地组织所有测试的结果,但核心转储是个例外。假设我有一个名为 的程序test。如果./test核心转储,以下几行将不会捕获它(因为它不会被传送到文件中):

./test 2>&1 > >(tee log)
./test > log 2>&1

这可能是由于脚本中的以下错误消息:

./script.sh:第 53 行:4783 中止(核心转储)./test 2>&1 >>(tee log)

我有一个巧妙的解决方法,可以make使用自定义规则启动该程序:

进行运行测试 2>&1 | tee -a log

目前这种方法可行,但使用 makefile 来执行此操作有点不方便。有没有其他方法可以捕获核心转储而无需中止 shell 脚本行?

答案1

如果您愿意从另一个脚本运行您的test程序,那么捕获该脚本的输出应该足够了。即,将“ ./test”放入testscript.sh,然后说

./testscript.sh > log 2>&1

一个更紧凑但不太直观的解决方案是

sh -c "./test" > log 2>&1

这两种解决方案都基于这样一个事实:运行程序的 shell 会注意到程序何时转储核心,并发出相应的错误消息。因此,要捕获该消息,您必须捕获 shell 的输出。

答案2

打印该消息的是 shell,而不是崩溃的程序。要捕获 shell 的输出,您需要:

{
./test
} > log 2 >&1

括号导致运行子 shell 来执行里面的命令,并且整个子 shell 的输出被重定向,而不仅仅是一个命令。

或者,如果您希望将所有输​​出重定向到脚本的其余部分,您可以使用:

exec > log 2>&1

相关内容