仅抑制脚本中的 bash 作业控制消息中止、管道损坏

问题描述

我有以下设置:

aborter.cpp

#include <cassert>
int main(int argc,char** argv) { assert(argc >= 2); return 0; }
// compiled to 'aborter'

test.sh

#!/usr/bin/bash

function runpipe() {
    yes | aborter "$@"
    test $? -ne 0 || echo OK
}
runpipe "$@"

运行 test.sh 123 仅打印 OK。仅运行 test.sh 输出以下内容

aborter: aborter.cpp:2: int main(int,char**): Assertion `argc >= 2' Failed.
./test.sh: line 3:  2521 broken pipe             yes
      2522 Aborted                 | aborter "$@"

在第二种情况下,如何抑制 bash 输出的“broken pipe”和“Aborted”作业控制行? 我希望输出只是 C++ 断言转储(第一行)。

这应该不需要编辑 aborter.cpptest.sh 界面。

解决方法

在第二种情况下如何抑制 bash 输出的“Broken pipe”和“Aborted”作业控制行?

将 bash stderr 重定向到 null,除了您的进程。

exec 3<&2 2>/dev/null
function runpipe() {
    yes | aborter "$@" 2>&3
    test $? -ne 0 || echo OK
}
runpipe "$@"