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

Bru*_*ier 7 bash shell zsh pipe io-redirection

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

ls -l > x | wc -l
Run Code Online (Sandbox Code Playgroud)

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

为什么它不能用于bash?

Pet*_*esh 8

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

例如

ls >a >b
Run Code Online (Sandbox Code Playgroud)

将同时获取ab填充目录的内容.

zshmisc文件:

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

date >foo >bar
Run Code Online (Sandbox Code Playgroud)

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

date >foo | cat
Run Code Online (Sandbox Code Playgroud)

将日期写入文件foo,并将其传递给cat.

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

$ setopt nomultios
$ ls -l > x | wc -l
0
$ setopt multios
$ ls -l > x | wc -l
36
Run Code Online (Sandbox Code Playgroud)