下面的命令在bash和zsh中运行时会输出不同的结果:
如果在非空目录中执行,bash 总是返回 0,而 zsh 返回正确的文件数。 x 包含预期的
ls -l > x | wc -l
如果在非空目录中执行,bash 总是返回 0,而 zsh 返回正确的文件数。 x 包含预期的
ls -l
输出。为什么 bash 不起作用呢?ls -l > x | wc -l
ls -l
输出。为什么 bash 不起作用呢?zshmisc
手册中的MULTIOS文档。它是zsh的一个功能,可以同时将输出重定向到多个文件,并且还可以作为管道使用。ls >a >b
将同时使用a
和b
填充目录的内容。
来自zshmisc
文档:
如果用户尝试多次打开一个文件描述符进行写操作,则shell会将该文件描述符作为管道打开,将其输入复制到所有指定的输出中,类似于tee命令,前提是MULTIOS选项已设置,默认情况下已设置。 因此:
date >foo >bar
foo
和bar
的文件中。请注意,管道是一个隐式重定向;因此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
ls -l
的输出被重定向到一个名为 'x' 的文件中。没有输出可以进入管道(所有输出都进入了 'x' 文件)。这是大多数标准 shell 的工作方式。
tee
命令(读取ls -l
的输出,将其写入文件并同时写入wc -l
)。相比于直接将ls -l
连接到文件x
或者wc -l
的标准输入,而不对正在处理的内容进行任何干预,这种方式显得有些突兀和不寻常,也不太适合作为 shell 提供的功能。 - Charles Duffyls -l | tee x | wc -l
。 - Charles Duffy