linux - <() 在 Bash 中做什么?

标签 linux bash shell redirect subprocess

a post's在 superuser.com 上回答,我们看到了

join <(sort abc) <(sort bcd)

将在发送文件 abc 和 bcd 之前对其进行排序。这导致了一个编程问题,更适合 stackoverflow。

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

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

即下面两行是等价的

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

但是

join (sort abc) (sort bcd)

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

最佳答案

这称为进程替换。

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

它等同于运行(除了它在可能的情况下使用管道而不是临时文件):

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

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

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

Here是 bash 手册中的相关部分。

关于linux - <() 在 Bash 中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57731426/

相关文章:

linux - 使用定界符在 BASH 中拆分大文件

linux - C Socket - 捕获的数据包具有相同的 ip_dst 和 ip_src

c - 如何使用宏扩展作为编译指示的第一个标识符?

ruby-on-rails - 混合使用 Ruby 和 bash 命令——mv 返回 "x and y are the same file"

c - 使用 rmmod (del_gendisk) 卸载时 Linux block 设备模块挂起

linux - 如何使用 find 复制和删除保持相同子目录结构的扩展

bash - 在 bash 中使用 .vimrc 设置

linux - 根据找到第一个模式找到一个模式并打印行 sed, awk grep

bash - 通过 shell 变量传递包含空格的参数

mysql - 在.bash_profile中已经设置了路径但仍然得到 '-bash: mysql: command not found'