Bash: 标准输入重定向后的多个文件

Bash: multiple files after standard input redirection

嘿,我已经研究了一段时间了,我想知道是否有人可以在 bash shell.

上解释这个特定功能的机制

假设我们有 3 个文件:test1.txttest2.txttest3.txt

每个文件的内容:

test1.txt = "foo"

test2.txt = "酒吧"

test3.txt = "你好世界"

如果我们 运行 在 bash shell 上执行以下命令:cat < test1.txt test2.txt test3.txt 我们将得到:

bar 

hello world

我的问题是为什么 test1.txt 的内容在这种情况下被忽略,如果有人有任何好的资源,我可以阅读这个特定功能。

在识别参数之前处理输入重定向。例如你显示的命令相当于每个

  • < test1.txt cat test2.txt test3.txt
  • cat test2.txt < test1.txt test3.txt
  • cat test2.txt test3.txt < test1.txt

无论如何,cat 的标准输入是 test1.txt,它接收两个命令行参数 test2.txttest3.txt

然而,

cat 只有在没有命名输入文件的参数时才从其标准输入中读取。如果要从标准输入和命名文件中读取,请使用 - 作为标准输入的“名称”。

# Same result as cat test1.txt test2.txt test3.txt
cat - test2.txt test3.txt < test1.txt

默认情况下,cat(与大多数实用程序一样)只有在没有文件名参数的情况下才从标准输入读取。由于您将 test2.txttest3.txt 作为文件名传递,因此它会忽略输入重定向。

但是,您可以使用 - 作为参数来表示标准。所以你可以这样做:

cat - test2.txt test3.txt < test1.txt

当您从文件重定向时这不是很有用,因为您可以只提供文件名作为普通参数而不是使用重定向,但它在管道时很有用:

grep foo test1.txt | cat - test2.txt test3.txt