bash '<(file contents)' 语法是什么?

mik*_*ana 25 bash file-descriptors

Security StackExchange 上的这个答案使用有趣的 bash 语法来生成内联文件:

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

这一点特别有趣:

<(openssl ecparam -name secp384r1)
Run Code Online (Sandbox Code Playgroud)

运行只是:

echo <(openssl ecparam -name secp384r1)
Run Code Online (Sandbox Code Playgroud)

我回来了 /dev/fd/63

所以这似乎用文件的内容创建了一个临时文件描述符。

这个叫什么?

ter*_*don 35

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

这是 bash 手册的相关部分:

3.5.6 进程替换

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

  <(list) 
Run Code Online (Sandbox Code Playgroud)

或者

  >(list) 
Run Code Online (Sandbox Code Playgroud)

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

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