zsh如何处理多重重定向?为何对cat程序透明且异于sh?
zsh多重输入重定向的实现原理
zsh之所以能让cat < file1 < file2显示两个文件内容且对cat完全透明,核心是它在启动cat进程前就完成了多文件内容的整合,而非让单个文件描述符指向多个文件。具体逻辑如下:
- zsh解析命令时,识别到多个
<输入重定向,会依次打开所有指定的文件 - 它会将这些文件的内容按顺序拼接成连续的数据流,然后把这个数据流作为
cat进程的标准输入传递过去 - 对于
cat来说,它只需要从STDIN_FILENO读取数据,完全感知不到背后是多个文件——因为它拿到的就是普通的连续输入流,和从单个文件或管道读取的形式毫无区别
而POSIX标准的sh(比如bash)仅执行最右侧的重定向,是因为POSIX规范明确规定:当出现多个输入重定向时,只有最后一个会生效,前面的重定向操作会被覆盖。zsh的这种行为属于对POSIX规范的扩展,额外支持了多文件输入的语法糖。
内容的提问来源于stack exchange,提问作者user129393192
相关产品推荐
相关产品推荐

