答案1
问题是每个实例2>&1
导致 stderr 再次重定向到已经完成的 stdout 的每个重定向。请参阅此示例多操作系统部分:
但是,请考虑:
date >output >&1
由于重定向是按顺序评估的,因此当
>&1
遇到时,标准输出将设置为文件输出,因此输出的另一个副本将发送到该文件。这不太可能是我们想要的。
并举一个例子来说明具体问题:
% (echo foo; echo bar >&2) &> baz &> baz2
% head baz baz2
==> baz <==
foo
bar
==> baz2 <==
foo
bar
在这里,每一行在每个文件中显示一次,这可能是这些重定向的目的。
> word 2>&1
但是,直接用以下形式替换&> word
:
% (echo foo; echo bar >&2) > baz 2>&1 > baz2 2>&1
% head baz baz2
==> baz <==
foo
bar
bar
==> baz2 <==
foo
bar
请注意发送到第一个文件的 stderr 的额外副本。
所以相当于&> word1 &> word2 &> word3 ...
实际上只是> word1 > word2 > word3 ... 2>&1
.