Bash中的<()是什么意思?

12
在superuser.com的帖子答案中,我们看到
join <(sort abc) <(sort bcd)

在将文件 abc 和 bcd 发送到 join 前会进行排序,这引出一个编程问题,最好适合在 stackoverflow 上讨论。

这是怎么工作的?这个 <() 结构究竟是什么?它叫什么名字?

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

也就是说,以下两行代码是等价的:

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

但是

join (sort abc) (sort bcd)

这是一个语法错误。请给我一些提示!


1
那些阅读 shell 精美手册的好传统去哪里了? - Jens
2个回答

21

这被称为进程替换。

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

它相当于运行以下命令(除非在可能的情况下使用管道而不是临时文件):

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

请注意,这两种排序的输出都作为要连接的文件名提供,而不是作为标准重定向。 (list) 是一个不同的结构,用于不同的目的。它只是创建一个子shell来执行list,并将其标准描述符提供给父shell。 这里是bash手册中相关的部分。

6

<(command)是一个进程替换(请参阅man bash中的相关部分)。基本上,command被执行并将其输出馈送到命名管道(FIFO),然后整个结构被管道的名称所替换,从而导致join /dev/fd/x /dev/fd/y


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接