如何抑制后台任务的报告输出?

时间:2015-07-02 15:32:30

标签: bash

通过报告输出来澄清,这里我指的是以[1]开头的那些:

$ echo hello world >&2 &
[1] 11714
hello world
[1]+  Done                    echo hello world 1>&2

这意味着我希望输出hello world

我对此做了很多搜索,我找到的解决方案是:

  1. 让它在子shell中运行
  2. set +m只能处理Done条消息。
  3. 明确地压制它:{ cmd & } 2>/dev/null,它不会取消Done,也会抑制我的所有stderr
  4. 但在我的情况下,他们不能很好地工作,因为我想要额外的并行性。框架应该是:

    cmd1 &>>log &
    cmd2 &>>log &
    wait
    cat file &
    cat file2 >&2 &
    wait
    

    如果我把东西放到子shell中,输出会被抑制,但wait不会阻止程序。

    其余两个选项不起作用,如我所说。

    最糟糕的是我期待将某些内容输出到stderr。所以我正在寻找一种方法来完全压制这些报道事物或任何其他可以提出的工作。

1 个答案:

答案 0 :(得分:2)

这非常难看,但看起来就像它在快速测试中一样。

set +m
{ { sleep 2; echo stdout; echo stderr >&2; } 2>&3- & } 3>&2 2>/dev/null

创建fd 3作为fd 2的副本,然后将fd 2重定向到/dev/null(以抑制背景ID / pid消息)。

然后,对于后台命令列表,将fd 3移回fd 2,以便尝试使用它的东西转到你想要的位置。

我的第一次尝试在外括号命令列表中有fd 3 mv但是没有正确地抑制id / pid消息(我想这发生得太快或者其他什么)。