为什么管道中的重定向在 Bash 和 Zsh 中表现不同?

Sas*_*lla 4 bash shell zsh pipe io-redirection

当连接到管道时,重定向在 Bash 和 Zsh 中的行为不同:

bash> echo foo >/dev/null | cat
bash>
Run Code Online (Sandbox Code Playgroud)
zsh> echo foo >/dev/null | cat
foo
zsh>
Run Code Online (Sandbox Code Playgroud)

Bash 符合我的预期;在 Zsh 中,重定向到的 STDOUT/dev/null似乎死而复生。

为什么会有这种差异?在每种情况下发生了什么?

ogu*_*ail 7

Zsh 有一个叫做multios的奇特功能。如果关闭它,行为将几乎与 Bash 相同。

% echo a >/dev/null | cat
a
% set +o multios          
% echo a >/dev/null | cat
% 
Run Code Online (Sandbox Code Playgroud)

这在手册中记录如下。

请注意,管道是一种隐式重定向;因此[,当multios开启时,默认开启]

date >foo | cat
Run Code Online (Sandbox Code Playgroud)

将日期写入文件foo,并将其通过管道传输到cat.