管道和输入流重定向到同一命令,命令采用哪个输入?

Abh*_*P G 3 bash pipe io-redirection

我试图运行下面给出的命令

cat numbers.txt | sort < words.txt
Run Code Online (Sandbox Code Playgroud)

上面的命令有一个从 cat 命令馈送到 sort 命令输入流的管道。但同时,sort命令的输入流也被重定向到words.txt文件。运行命令时,我发现words.txt 中的数据已按排序命令排序并显示回终端中。

我不明白在这种情况下外壳程序如何处理管道和重定向。一个命令是否可以接受来自两个不同源的输入流。我对其内部工作方式的想法是,由于重定向和管道是沿着命令从左到右处理的,因此首先将 cat 命令的输出流作为 sort 命令的输入流。但由于排序命令在该管道之后提供了另一个输入流重定向,因此排序命令的输入流将连接到words.txt。因此,当命令执行时,words.txt 中的数据只会到达排序命令。

另外为什么以下命令不运行。我已经通过覆盖更改了重定向,通过附加重定向。

cat numbers.txt | sort << words.txt
Run Code Online (Sandbox Code Playgroud)

有一个与此部分类似的问题,但我无法完全理解外壳程序如何处理管道和重定向。

Ste*_*itt 5

重定向是从左到右处理的,在 Bash 中是在管道之后(事实上,在任何 POSIX shell中)。在

\n
cat numbers.txt | sort < words.txt\n
Run Code Online (Sandbox Code Playgroud)\n

shell 首先将sort\xe2\x80\x99s (未来)标准输入设置为来自 的管道cat,但随后在处理 时< words.txt,将其更改为读取words.txt

\n

<<启动一个定界符:

\n
cat numbers.txt | sort << words.txt\n
Run Code Online (Sandbox Code Playgroud)\n

将等待一行显示 \xe2\x80\x9cwords.txt\xe2\x80\x9d (因为它在命令中被指定为输入结束标记)。请参阅shell 的控制和重定向运算符是什么?

\n