Bash Zsh输出重定向行为
在Bash Zsh输出重定向行为,bash,zsh,io-redirection,Bash,Zsh,Io Redirection,在bash中: bash% echo xxx >&2 | wc xxx 0 0 0 zsh% echo xxx >&2 | wc xxx 1 1 4 zsh% { echo xxx >&2; } | wc xxx 0 0 0 在zsh中: bash% echo xxx >&2 | wc xxx 0 0 0 zsh% echo xxx >&2 | wc xxx
bash
中:
bash% echo xxx >&2 | wc
xxx
0 0 0
zsh% echo xxx >&2 | wc
xxx
1 1 4
zsh% { echo xxx >&2; } | wc
xxx
0 0 0
在zsh
中:
bash% echo xxx >&2 | wc
xxx
0 0 0
zsh% echo xxx >&2 | wc
xxx
1 1 4
zsh% { echo xxx >&2; } | wc
xxx
0 0 0
在这种情况下,如何使
zsh
表现得像bash
?是否有要设置的zsh
选项?要更改行为临时,只需将括起来即可:
(echo xxx >&2) | wc
请注意,在此处插入括号没有任何副作用,因为即使没有括号,由于使用管道(|
),您的命令也会在子shell中运行
要更改整个外壳的行为,请参见
性能注意事项:
(echo xxx >&2) | wc
@chepner在注释中询问括号是否会导致额外的子shell(以及子进程)
令人惊讶的答案恰恰相反:启用选项
MULTIOS
(默认设置)时,使用括号将减少1个子shell
当选项MULTIOS
处于关闭状态时,括号(此时不需要)没有任何区别
我如何测试: 在OSX10.9.2上,我使用了
sudodtruss-tfook-f-p{pidOfZsh}
来监视fork()
在zsh
shell中的调用zsh
版本是zsh 5.0.2(x86_64-apple-darwin13.0)
当选项
MULTIOS
打开时,echo xxx>&2|wc
分叉3次,而(echo xxx>&2)|wc
仅分叉2次。关闭MULTIOS选项会更改此行为
% echo xxx >&2 | wc
xxx
1 1 4
% setopt NOMULTIOS
% echo xxx >&2 | wc
xxx
0 0 0
设置选项后,一个命令可以有多个IO重定向,为此,它显示管道计数为一个。是
zsh
对此进行了优化,还是只是在管道创建的子shell中启动另一个子shell?根据,启用MULTIOS
,echo xxx>&2 | wc
似乎对stderr(2)
和wc
都进行了回声stdout
在我发布此消息后,我确实在MULTIOS
下的man zshmisc
中发现了一条注释,管道被视为标准输出的隐式重定向。