为什么管道中的重定向在Bash和Zsh中表现不同?
当连接到管道时,重定向在 Bash 和 Zsh 中的行为不同:
bash> echo foo >/dev/null | cat
bash>
zsh> echo foo >/dev/null | cat
foo
zsh>
Bash 符合我的预期;在 Zsh 中,重定向到的 STDOUT/dev/null似乎死而复生。
为什么会有这种差异?在每种情况下发生了什么?
回答
Zsh 有一个叫做multios的奇特功能。如果关闭它,行为将几乎与 Bash 相同。
% echo a >/dev/null | cat
a
% set +o multios
% echo a >/dev/null | cat
%
这在手册中记录如下。
请注意,管道是一种隐式重定向;因此[,当multios开启时,默认开启]
date >foo | cat将日期写入文件
foo,并将其通过管道传输到cat.