安装RVM的命令如何工作?

安装RVM的命令如何工作?

一个新手的问​​题..我正在安装右心室(一种管理工具红宝石版本)。其命令为:

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

我有点知道这<是一个命令重定向运算符(正确吗?)。

那么,为什么<需要第二个(它起什么作用)?

答案1

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

如果你输入echo <(ls)它将打开一个新的文件描述符,其名称将被替换。因此命令可能会变成说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 ...

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

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

与 < 运算符一起将文件的输出重定向到程序对 stdin 的读取,这使得以下内容意义

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

澄清:

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

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

if [ -f my_condition ] then something fi

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

答案2

为了澄清 Stefano 的观点,第二个 < 不仅仅是一个 <,它实际上是 <()

您可能已经熟悉类似的构造 $(),它生成一个字符串,该字符串是其中命令的结果。因此:

$ which bash # echo the path to bash
/bin/bash
$ ldd $(which bash) # return which libraries bash is linked to
...

字符串替换后,这相当于

ldd /bin/bash

正如 Stefano 所说,<() 做了非常相似的事情,但是返回的是一个文件描述符。

您可以在 中找到 bash 文档man bash。由于它是一个很大的手册页,您可以搜索(按/<\((您需要退出左括号 - 搜索<(不起作用)。

相关内容