zsh 如何处理多个重定向?

use*_*192 0 c operating-system zsh file sh

例如,在 中zsh,您可以执行以下操作:

% cat < file1 < file2
Run Code Online (Sandbox Code Playgroud)

你会看到两者。如何zsh在对程序透明的同时做到这一点cat

cat程序在 POSIX 系统上读取STDIN_FILENO并打印STDOUT_FILENO,那么一个文件描述符如何指向多个打开的文件描述呢?在 中sh,仅执行最后一个重定向(最右侧)。

Sha*_*awn 5

zsh将此称为“multios”,输入重定向的工作原理是使用子进程按顺序读取文件并将其内容转发到连接到被重定向到的进程的标准输入的管道。

文档中:

如果用户尝试多次打开文件描述符进行读取,则 shell 将文件描述符作为进程的管道打开,该进程按照指定的顺序将所有指定的输入复制到其输出(前提是MULTIOS设置了该选项)。

(对同一描述符的多个输出重定向采用类似的方法。)

Sosomething <file1 <file2大致相当于,尽管输入文件的打开时间cat file1 file2 | something存在一些细微的差异- 一次打开与依次打开。cat