join 和 cat 中的重定向

Redirection in join and cat

我想知道如何在本网站的示例中使用重定向 https://shapeshed.com/unix-join/

这是输入

$ cat wine.txt
White Reisling Germany
Red Riocha Spain
Red Beaunes France

$ cat reviews.txt
Riocha Meh
Beaunes Great!
Reisling Terrible!

这是命令和结果

$ join -1 2 -2 1 <(sort -k 2 wine.txt) <(sort reviews.txt)
Beaunes Red France Great!
Reisling White Germany Terrible!
Riocha Red Spain Meh

但在这种情况下,双重使用 < 不起作用

$ cat file 1
Hello
$ cat file 2
World

我期待

$ cat <file1 <file2    
Hello World

但结果是

World

你们有什么想法吗?

您的示例需要重写为这样,才能按预期工作:

cat <(cat file1) <(cat file2)  

<(cmd) 是进程替换。它与 - 但完全无关 - 用于重定向的 < 共享一个字符:

  • <(cmd) 扩展为一个文件名,您可以打开并阅读该文件以获取程序的输出。您可以向命令传递任意数量的文件名。
  • < filename 打开一个文件名为文件描述符 0 的文件。在同一文件描述符上打开一个新文件会覆盖并关闭前一个文件。

您的流程替换示例仅传递两个单独的文件名:

$ echo join -1 2 -2 1 <(sort -k 2 wine.txt) <(sort reviews.txt)
join -1 2 -2 1 /dev/fd/63 /dev/fd/6

如果您将两个文件名类似地传递给 cat,您会得到相同类型的结果:

$ cat file1 file2
Hello
World