2010-11-04 41 views
7

的RVM主页是什么意思 “的bash <<(卷曲http://rvm.io/releases/rvm-install-head)”

http://rvm.io/

建议人们使用RVM安装

bash < <(curl http://rvm.io/releases/rvm-install-head) 

这是什么语法? command <(another_command)

难道原始行是? curl http://rvm.io/releases/rvm-install-head | bash

+0

这是真的很老,没有更多的相关 – mpapis 2013-01-08 02:30:30

+1

即使使用了特定的命令(更具体地说,URL - 人们将'http:// rvm.beginrescueend.com /'更改为'http://rvm.io /'相当系统地),这个问题并不是关于URL,而是关于shell符号([Process Substitution](http://www.gnu.org/software/bash/manual/bash.html#Process-Substitution)) 。这个问题仍然与符号相关(但可能是另一个问题的重复;其他人需要研究这个问题)。 – 2013-01-08 05:48:22

回答

14

<(command)创建与命令的输出命名管道(或使用现有/dev/fd文件),并替换该管道的文件名进入命令。然后<重定向来自给定文件的标准输入。

所以,是的,在这种情况下,这是什么原因,他们建议更复杂,更便携版本相当于

curl http://rvm.io/releases/rvm-install-head | bash 

我不知道。在某些情况下,由于管道为接收输入的命令(在这种情况下为bash)创建了一个子shell,而< <()为生成输出的命令创建了一个子shell,所以您希望使用< <()的版本使用管道的版本。如果您使用管道,那么子shell中的命令无法修改shell环境中的变量,有时这是需要的(如果您想将某些东西传递给while read ...命令)。但是,在这种情况下,命令的输出只是直接传递给bash的显式调用;这里没有任何东西需要从父shell运行。

+0

我相信使用这种语法的原因是,脚本在执行之前完全下载到命名管道。否则,该脚本可能在传输过程中被截断,并且将会运行一个截断的脚本(可能有错误)。 – robbyt 2015-02-18 04:21:19

4

请参阅part 23 of the advanced bash scripting guide

总之,<(x)>(y)语法的作用有以下几点:

  • 你把它们放在你的命令行,其中一个文件名,预计

  • 封闭式命令要么

    • 将stdout重定向到(<(x))或
    • 从(>(y)

    一个临时文件(或命名管道,bash将对其进行管理)读取标准输入,它的名称将给予你的外部命令。