12

在superuser.com 上的帖子回答中,我们看到

join <(sort abc) <(sort bcd)

将文件 abc 和 bcd 排序,然后将它们发送到加入。这导致了一个编程问题,更适合stackoverflow。

这是如何运作的?这个 <() 结构到底是什么?它叫什么?

如果 (sort abc) 是在 abc 上运行 sort 并返回输出的合法调用,为什么我们需要<?

即下面两行是等价的

(sort abc) | join - <(sort bcd)
join <(sort abc) <(sort bcd)

join (sort abc) (sort bcd)

是语法错误。请给我线索!

4

2 回答 2

21

这称为进程替换。

<(list)是一个单一的语法结构,在这种情况下,'<' 字符不是一个单独的符号。它执行list并将其输出作为文件(不是标准重定向)提供给命令。

它相当于运行(除了它尽可能使用管道而不是临时文件):

sort abc > /tmp/1
sort bcd > /tmp/2
join /tmp/1 /tmp/2

请注意,两种类型的输出都作为要加入的文件名提供,而不是作为标准重定向。

(list)是不同的构造,用于不同的目的。它只是创建一个执行list的子 shell ,将其标准描述符提供给父 shell。

是 bash 手册中的相关部分。

于 2009-08-19T13:01:14.753 回答
6

<(command)是一个过程替换(参见 中的相应部分man bash)。基本上,命令运行并将其输出馈送到命名管道(FIFO),然后整个构造被管道的名称替换,从而导致.join /dev/fd/x /dev/fd/y

于 2009-08-19T13:03:12.117 回答