什么"<()"在bash中意味着什么?

Lai*_*uan 20 bash command-line

我正在尝试安装RVM.有一个神奇的命令行:

bash < <(curl -s https://rvm.io/install/rvm)
Run Code Online (Sandbox Code Playgroud)

我知道bash和curl是什么.我知道第一个<是I/O重定向.但<()语法意味着什么?

这个命令和之间有什么区别

bash < `curl -s https://rvm.io/install/rvm`
Run Code Online (Sandbox Code Playgroud)

?(后一个命令不起作用)

Nem*_*emo 20

这是bash的进程替换.

表达式<(list)被文件名替换,无论是命名FIFO还是下面的条目/dev/fd.因此,要实际重定向输入,您必须使用< <(list).

[编辑; 忘了回答你的第二个问题]

反引号称为"命令替换".与进程替换不同,它是POSIX shell规范的一部分(即,不是bash扩展).shell在反引号中运行命令并在命令行上替换其输出.所以这是有道理的:

cat < `echo /etc/termcap`
Run Code Online (Sandbox Code Playgroud)

但这不会:

cat < `cat /etc/termcap`
Run Code Online (Sandbox Code Playgroud)

后者类似于你的例子; 它尝试使用命令的(复杂)输出作为重定向标准输入的文件名.


Cos*_*sta 7

其他人已经很好地回答了你的问题.我只是添加一个例子来构建它们...... 99%的时候,当我个人使用时<(),它是在一次镜头中区分两个不同命令的输出.例如,

diff <( some_command ) <( some_other_command )