例如,在zsh中,您可以执行以下操作:
zsh
% cat < file1 < file2
你会看到两者。zsh如何做到这一点,同时对cat程序透明?在POSIX系统上,cat程序从STDIN_FILENO读取并打印到STDOUT_FILENO,那么一个文件描述符如何指向多个打开的文件描述呢?在sh中,只执行最后一个重定向(最右边)。
cat
STDIN_FILENO
STDOUT_FILENO
sh
8hhllhi21#
zsh称之为“multios”,输入重定向通过使用子进程按顺序读取文件并将其内容转发到连接到被重定向到的进程的标准输入的管道来工作。来自文档:如果用户尝试多次打开文件描述符进行阅读,shell将打开文件描述符作为一个进程的管道,该进程按照指定的顺序将所有指定的输入复制到其输出,前提是设置了MULTIOS选项。(类似的方法被用于相同描述符的多个输出重定向。因此something <file1 <file2大致等同于cat file1 file2 | something,尽管在 * 何时 * 打开输入文件方面存在一些细微的差异--一次打开所有输入文件与cat顺序打开输入文件。
MULTIOS
something <file1 <file2
cat file1 file2 | something
vhmi4jdf2#
zsh读取文件并将其写入管道。[1] zsh读取文件并将其写入管道。换句话说
prog <file1 <file2
结果类似于
cat file1 file2 | prog
差异:
% perl -e'exec "ls", "-l", "/proc/$$/fd"' <file1 <file2 total 0 lr-x------ 1 ikegami ikegami 64 Jun 4 16:16 0 -> 'pipe:[26665]' lrwx------ 1 ikegami ikegami 64 Jun 4 16:16 1 -> /dev/pts/0 lrwx------ 1 ikegami ikegami 64 Jun 4 16:16 2 -> /dev/pts/0 lr-x------ 1 ikegami ikegami 64 Jun 4 16:16 3 -> /proc/366/fd
% ps PID TTY TIME CMD 15 pts/0 00:00:00 bash 338 pts/0 00:00:00 zsh 372 pts/0 00:00:00 ps % perl -e'exec "ps"' <file1 <file2 PID TTY TIME CMD 15 pts/0 00:00:00 bash 338 pts/0 00:00:00 zsh 373 pts/0 00:00:00 ps 374 pts/0 00:00:00 zsh <defunct> <- Helper
2条答案
按热度按时间8hhllhi21#
zsh
称之为“multios”,输入重定向通过使用子进程按顺序读取文件并将其内容转发到连接到被重定向到的进程的标准输入的管道来工作。来自文档:
如果用户尝试多次打开文件描述符进行阅读,shell将打开文件描述符作为一个进程的管道,该进程按照指定的顺序将所有指定的输入复制到其输出,前提是设置了
MULTIOS
选项。(类似的方法被用于相同描述符的多个输出重定向。
因此
something <file1 <file2
大致等同于cat file1 file2 | something
,尽管在 * 何时 * 打开输入文件方面存在一些细微的差异--一次打开所有输入文件与cat
顺序打开输入文件。vhmi4jdf2#
zsh
读取文件并将其写入管道。[1]zsh
读取文件并将其写入管道。换句话说
结果类似于
差异:
cat
,但它确实创建了一个新的进程来帮助它。