Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Zsh输出重定向行为_Bash_Zsh_Io Redirection - Fatal编程技术网

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
中发现了一条注释,管道被视为标准输出的隐式重定向。