Macos 抑制信号输出,如;中止陷阱:6“;在shellscript中,用于应崩溃的测试
当从bash启动的程序崩溃时,一些有用的东西会输出Abort trap:6: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(); }
$ ./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再也不会将其视为顶级产品了。