当我运行时1>&2 echo hi |& grep hi
,我会得到一个非彩色的 hi,然后在新的一行上出现一个红色的 hi。这与 的输出相同1>&2 echo hi | grep hi
。为什么前者的两个“hi”不是红色的?
答案1
您的第一个管道:
1>&2 echo hi |& grep hi
这与
echo hi 1>&2 2>&1 | grep hi
因为|&
与 相同2>&1 |
。
设置 shell 选项后MULTIOS
,这会将 的输出复制echo
到标准错误。这会产生从未见过hi
的无色物体grep
。另一个hi
穿过grep
并着色。
重定向2>&1
不会执行任何操作,因为 . 没有输出到标准错误echo
。如果你有例如,情况会有所不同
{ echo hi 1>&2; } 2>&1 | grep hi
或者
{ echo hi 1>&2; } |& grep hi
标准输出echo
将在哪里不是被复制,并且 的标准错误{ ...; }
将被发送到grep
,产生单色hi
.
你的第二条管道,
1>&2 echo hi | grep hi
或者,
echo hi 1>&2 | grep hi
(这与删除无操作重定向的第一个管道相同2>&1
)也重定向标准输出两次;一次到标准错误(未着色hi
),一次到管道(有色hi
)。
对于两个颜色hi
的:
echo hi 2>&1 1>&2 | grep hi
或者
echo hi 1>&1 | grep hi
(这需要一点点挥手,因为我不太习惯 shell zsh
)