安装RVM的命令如何工作?

Zab*_*bba 2 command-line bash

一个新手问题.. 我正在安装RVM(一个管理Ruby版本的工具)。它的命令是:

bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )
Run Code Online (Sandbox Code Playgroud)

我知道这<是一个命令重定向操作符(对吗?)。

那么,为什么<需要第二个(它做什么)?

Ste*_*zzo 5

它将一个字符串转换为它所代表的 bash 脚本输出的文件描述符。这可能会令人困惑,这是一个例子

如果您键入echo <(ls)它将打开一个新的文件描述符,其名称被替换。所以命令可能会变成 say echo /dev/fd/63

需要文件的程序现在可以读取命令的输出而无需接受标准输入。

$ my_program ls
Error: 'ls': No such file or directory.
$ my_program <(ls)
my_program was called with the argument /dev/fd/63
bin dev etc ...
Run Code Online (Sandbox Code Playgroud)

如果没有提供输入源,许多 Linux 程序将等待标准输入。因为可以使用“|”运算符将标准输出通过管道传输到标准输入,因此您可以使用 say ls | grep hello。这只有效,因为 grep 会一直等待输入,如果它希望打开并读取文件名以获取其数据,则管道运算符不起作用。这就是为什么你需要 <(...)。

我希望这是可以理解的。:-)

与 < 运算符一起将文件的输出重定向到读取 stdin 的程序,这具有以下含义

Bash:读取此文件的输出,该文件是根据此命令的输出创建的。

说明:

  • 标准输入:一个“文件”(不是真的,但在 linux 中一切都像一个文件),当读取时,它神奇地包含您输入的内容
  • 标准输出:一个“文件”,写入时将打印到虚拟终端
  • 运算符(即<or <()):与常规数学相同,运算符和操作数的表达式将被评估和替换。3+2*3 变成 5*3 变成 15。在 bash 语言中也是如此。

强调罗杰观点的一个很好的例子是这个表达式:

if [ -f my_condition ] then something fi
Run Code Online (Sandbox Code Playgroud)

这里括号的内容将作为条件语句进行评估,即如果 my_condition 为真,则执行某些操作。但是:[实际上只是程序的别名test,当使用参数 -f 调用它时,将检查文件是否存在。