在 shell 脚本中抑制信号输出,如“Abort trap: 6”,以进行可能崩溃的测试

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)

Bil*_*low 3

解决方案是在子 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。

制作人员