Zsh输出重定向行为

时间:2014-03-31 13:26:39

标签: bash zsh io-redirection

bash

bash% echo xxx >&2 | wc
xxx
   0   0   0

zsh

zsh% echo xxx >&2 | wc
xxx
   1   1   4
zsh% { echo xxx >&2; } | wc
xxx
   0   0   0

在这种情况下,如何让zsh表现得像bash?是否设置了zsh选项?

2 个答案:

答案 0 :(得分:3)

要更改行为 ad-hoc ,您只需括号

(echo xxx >&2) | wc

请注意,此处括号内没有副作用,因为使用管道(|),即使没有它,您的命令也会在子shell中运行。

要更改整个shell 的行为,请参阅@chepner's answer


效果考虑因素

@chepner在评论中询问括号是否会产生附加子shell(以及子进程)。

令人惊讶的答案恰恰相反:
选项MULTIOS为ON(默认值),使用括号会导致 1个子shell。

当选项MULTIOS关闭时,括号(不需要括号)没有区别。


我是如何测试的:

在OS X 10.9.2上,我使用sudo dtruss -t fork -f -p {pidOfZsh}来监控fork() shell中的zsh次呼叫; zsh版本为zsh 5.0.2 (x86_64-apple-darwin13.0)

选项MULTIOS开启,echo xxx >&2 | wc分叉 3 次,而(echo xxx >&2) | wc仅分叉 2 次。

答案 1 :(得分:3)

关闭MULTIOS选项会改变此行为。

% echo xxx >&2 | wc
xxx
       1       1       4
% setopt NOMULTIOS
% echo xxx >&2 | wc
xxx
       0       0       0

设置选项后,单个命令可以有多个IO重定向,为此,管道显示为一个。