Macos 抑制信号输出,如;中止陷阱:6“;在shellscript中,用于应崩溃的测试

Macos 抑制信号输出,如;中止陷阱:6“;在shellscript中,用于应崩溃的测试,macos,bash,testing,terminal,signals,Macos,Bash,Testing,Terminal,Signals,当从bash启动的程序崩溃时,一些有用的东西会输出Abort trap:6: $ ./crash-if-correct > /dev/null 2>&1 Abort trap: 6 对于应该崩溃的测试用例,这会创建看起来错误的输出。这怎么能抑制呢 我怀疑不是shell(在我的例子中是bash),因为bash源代码中的ack'陷阱:'没有显示任何信息 复制的简单方法: $ cat <<EOF > abort.c main() { abort(); }

当从bash启动的程序崩溃时,一些有用的东西会输出Abort trap:6:

$ ./crash-if-correct > /dev/null 2>&1
Abort trap: 6
对于应该崩溃的测试用例,这会创建看起来错误的输出。这怎么能抑制呢

我怀疑不是shell(在我的例子中是bash),因为bash源代码中的
ack'陷阱:'
没有显示任何信息

复制的简单方法:

$ cat <<EOF > abort.c
main()
{
   abort();
}
EOF

$ cc -w -o abort abort.c
$ sh -c ./abort > /dev/null 2>&1
Abort trap: 6
$cat/dev/null 2>&1
中止陷阱:6

此消息由shell生成,它以这种方式传递子进程异常结束的消息。按以下方式运行:

sh -c ./crash-if-correct > /dev/null 2>&1
运行此程序:

#include <stdlib.h>

int main(void) {
    abort();
    return 0;
}
下面是使用附加外壳时的输出:

$ ./a.out > /dev/null 2>&1
Aborted (core dumped)
$ 
$ sh -c ./a.out > /dev/null 2>&1
$ 

解决方案是在子shell中运行子进程:

$ cc -w -o abort abort.c
$ $(./abort)
$
这在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
$
$cat hello abort.c
main()
{
放置(“你好”);
中止();
}
$cc-w-o hello abort hello abort.c
美元/你好中止
你好
中止陷阱:6
$$(/你好中止)
bash:Hello:command未找到#&1$(/你好中止>&3);执行官3>&-
你好
$
在zsh中,最后一个命令的返回值为134。将
| | true
附加到命令,使其变为0


这不起作用,它还会产生信号输出。我将用一个简单的例子来更新我的问题。我编写了与您类似的程序(调用abort函数),但在另一个shell中运行它不会产生任何输出。你在用什么操作系统/外壳?很有趣。正如我在问题中所写的,我正在使用bash。(在OS X中的Terminal.app内部)@user309323:所以这看起来像是OS X的特殊行为。。。我在Ubuntu 12.04下的
terminator
terminator中添加了
abort
函数在bash中的行为示例。当然,这不会改变什么,所以看起来我无能为力。对不起。总的来说,这不是什么大问题。您的解决方案可以在linux上运行,但我想OS X上的Terminal.app会干扰我的工作。如果我做了15次,你会发现我给了你一个加号:)这对我很有用。这很奇怪,因为没有美元就没有了。但那不应该是一个地下地狱吗?恐怕我不知道。请检查编辑也-文本将与初始答案一起执行
3>&1
做什么?我从来没见过。如果我做了
If./hello中止;那是真的;否则错误;fi 2>/dev/null
然后您的可执行文件工作并且不打印中止陷阱:6消息。
3>&1
创建文件描述符3,并将其重定向到标准输出<代码>3>&-关闭文件描述符。您的解决方案也可以工作,实际上只需要执行
sh-c”(/abort)“2>/dev/null
。我认为Terminal.app再也不会将其视为顶级产品了。