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?
阅读MULTIOS文档的zshmisc手册页.这是zsh的一个特性,它使输出同时重定向到多个文件,它也可以是一个管道.
例如
ls >a >b
Run Code Online (Sandbox Code Playgroud)
将同时获取a并b填充目录的内容.
从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)