在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
选项?
答案 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重定向,为此,管道显示为一个。