C语言 zsh如何处理多个重定向?

bn31dyow  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(147)

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

% cat < file1 < file2

你会看到两者。zsh如何做到这一点,同时对cat程序透明?
在POSIX系统上,cat程序从STDIN_FILENO读取并打印到STDOUT_FILENO,那么一个文件描述符如何指向多个打开的文件描述呢?在sh中,只执行最后一个重定向(最右边)。

8hhllhi2

8hhllhi21#

zsh称之为“multios”,输入重定向通过使用子进程按顺序读取文件并将其内容转发到连接到被重定向到的进程的标准输入的管道来工作。
来自文档:
如果用户尝试多次打开文件描述符进行阅读,shell将打开文件描述符作为一个进程的管道,该进程按照指定的顺序将所有指定的输入复制到其输出,前提是设置了MULTIOS选项。
(类似的方法被用于相同描述符的多个输出重定向。
因此something <file1 <file2大致等同于cat file1 file2 | something,尽管在 * 何时 * 打开输入文件方面存在一些细微的差异--一次打开所有输入文件与cat顺序打开输入文件。

vhmi4jdf

vhmi4jdf2#

zsh读取文件并将其写入管道。[1] zsh读取文件并将其写入管道。
换句话说

prog <file1 <file2

结果类似于

cat file1 file2 | prog

差异:

  • 它实际上并不使用cat,但它确实创建了一个新的进程来帮助它。
  • 所有文件句柄都是在前面打开的,而不是在需要时打开。
% 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

相关问题