bash与zsh中的重定向和管道行为

时间:2015-04-21 21:19:46

标签: bash shell pipe zsh io-redirection

以下命令输出不同的结果,具体取决于它是以bash还是zsh运行:

ls -l > x | wc -l

如果在非空目录中执行,bash总是给出0,而zsh给出正确数量的文件。 x 包含ls -l的输出,如预期的那样。

为什么它不能用于bash?

2 个答案:

答案 0 :(得分:8)

阅读zshmisc手册页中的MULTIOS documentation。这是zsh的一个特性,它使输出同时重定向到多个文件,它也可以是一个管道。

e.g。

ls >a >b

将同时填充ab目录内容。

来自zshmisc文档:

  

如果用户尝试打开文件描述符以进行多次写入,则shell会打开文件描述符作为管道,将其输入复制到所有指定的输出,类似于tee,前提是已设置MULTIOS选项,因为它是默认情况下。因此:

date >foo >bar
  

将日期写入两个名为foobar的文件。请注意,管道是隐式重定向;从而

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会做它的作用。