【问题标题】:what does "<()" mean in bash?bash 中的“<()”是什么意思?
【发布时间】:2011-07-19 18:21:21
【问题描述】:

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

bash < <(curl -s https://rvm.io/install/rvm)

我知道 bash 和 curl 是什么。我知道第一个&lt; 是I/O 重定向。但是&lt;() 语法是什么意思呢?

这个命令和

有什么区别
bash < `curl -s https://rvm.io/install/rvm`

?(后面的命令不起作用)

【问题讨论】:

  • 我不知道,但它看起来像一只企鹅!
  • 在您的第二个示例中,您的命令扩展为一个字符串,该字符串 bash 并尝试将其连接到您的进程的输入流。尝试cat &lt; somefile 了解和cat &lt; &lt;(echo test)。它可能告诉X file does not exists
  • @tomasz: 正是我的想法 (")>
  • 请注意,如果使用此语法,它可能会在 /tmp/ 目录中留下命名管道;即使在进程终止之后。因此,您还需要一些方案来清理您的 /tmp/ 目录。

标签: bash command-line


【解决方案1】:

这是 bash 的process substitution

表达式&lt;(list) 被替换为文件名,可以是命名的FIFO 或/dev/fd 下的条目。所以要真正从它重定向输入,你必须使用&lt; &lt;(list)

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

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

cat < `echo /etc/termcap`

但这不会:

cat < `cat /etc/termcap`

后者与您的示例类似;它尝试使用命令的(复杂)输出作为重定向标准输入的文件名。

【讨论】:

    【解决方案2】:

    其他人已经很好地回答了你的问题。我将添加一个示例来构建它们......当我个人使用&lt;() 时,99% 的时间都是为了一次性区分两个不同命令的输出。例如,

    diff &lt;( some_command ) &lt;( some_other_command )

    【讨论】:

      【解决方案3】:

      io重定向的语法是

      process < file
      

      因此,您需要 io 重定向后出现的任何内容作为文件名。

      反引号扩展实际上将命令的结果放入命令行。因此,

       `curl -s https://rvm.io/install/rvm`
      

      扩展为类似 #!/usr/bin/env bash ...

      shell 会感到困惑,因为它会看到

       bash < #... 
      

      而不是文件名。

      &lt;() 运算符是进程替换,它生成一个新进程来运行 (..) 中的命令。将创建一个新文件或管道来捕获结果。箭头指向左侧&lt;() 而不是&gt;() 的事实意味着内部进程的输出将被写入文件,该文件可以被进程读取。

      在您的情况下,bash &lt; &lt;(...) 将被视为类似于 bash &lt; /dev/fd/100

      如果你真的想看看发生了什么,运行

      echo <(curl -s https://rvm.io/install/rvm)
      

      【讨论】:

        【解决方案4】:

        它被称为Process Substitution

        【讨论】:

          猜你喜欢
          • 2012-05-12
          • 2016-05-24
          • 1970-01-01
          • 2022-11-17
          • 2013-07-15
          • 1970-01-01
          • 2012-04-19
          • 2015-09-27
          • 2015-09-18
          相关资源
          最近更新 更多