bash'<(文件内容)'的语法是什么?


25

有关Security StackExchange的答案使用了一种有趣的bash语法来内联生成文件:

openssl req -new -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout cert.key -out cert.crt -days 3650

这一点特别有趣:

<(openssl ecparam -name secp384r1)

仅运行:

echo <(openssl ecparam -name secp384r1)

我回来 /dev/fd/63

因此,这似乎可以创建一个包含文件内容的临时文件描述符。

这个叫什么?


3
请注意,生成的“文件”实际上是一个命名管道,并且某些程序不支持将它们作为文件参数。示例:git diff --no-index file1 <(cat file2)将失败,并显示:error: /dev/fd/63: unsupported file type。您可能还会看到error: readlink("/dev/fd/63"): No such file or directory实现是否创建了到管道的符号链接(出于某种原因,对于我来说,它显示为断开的链接)。
开尔文

Answers:


35

它被称为进程替换,是bash,zsh和ksh的功能(可能还有其他功能,我不知道)。它不是POSIX,您不应该在可移植代码中使用它,但是它非常有用。

这是bash手册的相关部分:

3.5.6流程替代

在支持命名管道(FIFO)或命名打开文件的/ dev / fd方法的系统上支持进程替换。它采取的形式

  <(list) 

要么

  >(list) 

运行进程列表时,其输入或输出连接到FIFO或/ dev / fd中的某个文件。作为扩展结果,此文件的名称作为参数传递给当前命令。如果使用>(list)形式,则写入文件将为list提供输入。如果使用<(list)形式,则应读取作为参数传递的文件以获得list的输出。请注意,<或>与左括号之间不得出现空格,否则该构造将被解释为重定向。

如果可用,进程替换将与参数和变量扩展,命令替换和算术扩展同时执行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.