use*_*235 6 testing macos bash terminal signals
当程序崩溃时,从 bash 启动的程序会输出Abort trap: 6 ,很有帮助:
$ ./crash-if-correct > /dev/null 2>&1
Abort trap: 6
Run Code Online (Sandbox Code Playgroud)
对于应该崩溃的测试用例,这会创建看起来错误的输出。这如何能够压制?
我怀疑这不是 shell(在我的例子中是 bash),因为ack 'trap:'通过 bash 源没有发现任何内容。
简单的重现方法:
$ cat <<EOF > abort.c
main()
{
abort();
}
EOF
$ cc -w -o abort abort.c
$ sh -c ./abort > /dev/null 2>&1
Abort trap: 6
Run Code Online (Sandbox Code Playgroud)
解决方案是在子 shell 中运行子进程:
$ cc -w -o abort abort.c
$ $(./abort)
$
Run Code Online (Sandbox Code Playgroud)
这对我在 OSX 上有效。
注意,如果./abort输出文本,就会执行
$ cat hello-abort.c
main()
{
puts("Hello");
abort();
}
$ cc -w -o hello-abort hello-abort.c
$ ./hello-abort
Hello
Abort trap: 6
$ $(./hello-abort)
bash: Hello: command not found # <== Danger
$ exec 3>&1; $(./hello-abort >&3); exec 3>&-
Hello
$
Run Code Online (Sandbox Code Playgroud)
在zsh中,最后一条命令的返回值为134,追加|| true到该命令后,使其变为0。