通过报告输出来澄清,这里我指的是以[1]
开头的那些:
$ echo hello world >&2 &
[1] 11714
hello world
[1]+ Done echo hello world 1>&2
这意味着我希望输出hello world
。
我对此做了很多搜索,我找到的解决方案是:
set +m
只能处理Done
条消息。{ cmd & } 2>/dev/null
,它不会取消Done
,也会抑制我的所有stderr
。但在我的情况下,他们不能很好地工作,因为我想要额外的并行性。框架应该是:
cmd1 &>>log &
cmd2 &>>log &
wait
cat file &
cat file2 >&2 &
wait
如果我把东西放到子shell中,输出会被抑制,但wait
不会阻止程序。
其余两个选项不起作用,如我所说。
最糟糕的是我期待将某些内容输出到stderr
。所以我正在寻找一种方法来完全压制这些报道事物或任何其他可以提出的工作。
答案 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消息(我想这发生得太快或者其他什么)。