以下命令输出不同的结果,具体取决于它是以bash还是zsh运行:
ls -l > x | wc -l
如果在非空目录中执行,bash总是给出0,而zsh给出正确数量的文件。 x 包含ls -l
的输出,如预期的那样。
为什么它不能用于bash?
答案 0 :(得分:8)
阅读zshmisc
手册页中的MULTIOS documentation。这是zsh的一个特性,它使输出同时重定向到多个文件,它也可以是一个管道。
e.g。
ls >a >b
将同时填充a
和b
目录内容。
来自zshmisc
文档:
如果用户尝试打开文件描述符以进行多次写入,则shell会打开文件描述符作为管道,将其输入复制到所有指定的输出,类似于tee,前提是已设置MULTIOS选项,因为它是默认情况下。因此:
date >foo >bar
将日期写入两个名为
foo
和bar
的文件。请注意,管道是隐式重定向;从而
date >foo | cat
将日期写入文件
foo
,并将其传递给cat。
要启用它,请执行setopt multios
,关闭setopt nomultios
:
$ setopt nomultios
$ ls -l > x | wc -l
0
$ setopt multios
$ ls -l > x | wc -l
36
答案 1 :(得分:3)
ls -l
的输出被重定向到名为'x'的文件中。没有输出进入管道(它全部进入'x')。这是大多数标准shell工作的方式。
这里的问题不是为什么bash不起作用,问题是为什么zsh会做它的作用。