<()在Bash中做了什么?

Dan*_*ein 11 linux bash shell redirect subprocess

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

join <(sort abc) <(sort bcd)
Run Code Online (Sandbox Code Playgroud)

在将文件发送到加入之前,它们会对文件abc和bcd进行排序.这导致编程问题,更适合stackoverflow.

这是如何运作的?这个<()构造究竟是什么?它叫什么?

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

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

(sort abc) | join - <(sort bcd)
join <(sort abc) <(sort bcd)
Run Code Online (Sandbox Code Playgroud)

join (sort abc) (sort bcd)
Run Code Online (Sandbox Code Playgroud)

是语法错误.请告诉我!

Jul*_*ano 21

这称为过程替换.

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

它等同于运行(除非它尽可能使用管道而不是临时文件):

sort abc > /tmp/1
sort bcd > /tmp/2
join /tmp/1 /tmp/2
Run Code Online (Sandbox Code Playgroud)

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

(list)是一个不同的结构,用于不同的目的.它只是创建一个执行list的子shell,为父shell提供标准描述符.

是bash手册中的相关部分.


Bom*_*mbe 5

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