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

Redirection and pipe behavior in bash vs. zsh

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

ls -l > x | wc -l

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

为什么它在 bash 中不起作用?

ls -l 的输出被重定向到名为 'x' 的文件中。没有输出进入管道(全部进入 'x')。这是大多数标准 shell 的工作方式。

这里的问题不是为什么 bash 不起作用,问题是为什么 zsh 做它做的事情。

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

例如

ls >a >b

将用目录的内容填充 ab

来自 zshmisc 文档:

If the user tries to open a file descriptor for writing more than once, the shell opens the file descriptor as a pipe to a process that copies its input to all the specified outputs, similar to tee, provided the MULTIOS option is set, as it is by default. Thus:

date >foo >bar

writes the date to two files, named foo and bar. Note that a pipe is an implicit redirection; thus

date >foo | cat

writes the date to the file foo, and also pipes it to cat.

要打开它 setopt multios,要关闭它 setopt nomultios:

$ setopt nomultios
$ ls -l > x | wc -l
0
$ setopt multios
$ ls -l > x | wc -l
36