我正在编写一个测试脚本来编译(通过 make)并运行一系列测试。我有一系列cat
、grep
和sed
命令,可以很好地组织所有测试的结果,但核心转储是个例外。假设我有一个名为 的程序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