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
将用目录的内容填充 a
和 b
。
来自 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
以下命令输出不同的结果,具体取决于它是 运行 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
将用目录的内容填充 a
和 b
。
来自 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
andbar
. 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