这些流程替换如何运作?

时间:2016-11-19 10:35:22

标签: bash shell redirect substitution process-substitution

有人可以解释这些流程替换的工作原理。

(echo "YES")> >(read str; echo "1:${str}:first";)> >(read sstr; echo "2:$sstr:two")> >(read ssstr; echo "3:$ssstr:three")

输出

  

1:2:3:YES:3:2:第一

我已经想通了,'ssstr'-Substitution得到FD 60,sstr FD 61和str FD 62.(从右到左)

但是如何(回声“是”)连接到FD60的输入,FD60的输出与输入FD61等等,最后FD62打印在终端上?

全部违背两个重定向的方向。

它们如何嵌套,以及如何连接? 让我发疯 TY。

1 个答案:

答案 0 :(得分:2)

首先,实际上不要写这样的代码:)

流程替换是构造>(...)(...)>不是特定的构造;它只是一个子shell,后跟输出重定向。

此示例是单个命令(echo "YES"),后跟三个输出重定向

  1. > >(read str; echo "1:${str}:first";)
  2. > >(read sstr; echo "2:$sstr:two")
  3. > >(read ssstr; echo "3:$ssstr:three")
  4. 最后一个是实际应用于原始命令的那个; echo word >foo >bar >baz之类的内容会创建所有三个文件,但echo的输出只会写入baz

    同样,所有三个进程替换都会启动一个新进程,但输出YES仅写入 last 。因此read ssstrecho YES获取其输入。

    此时,我认为你看到的是未定义的行为。三个进程替换以它们创建的相反顺序运行,就好像操作系统在创建下一个进程时将每个进程推送到堆栈,然后通过将它们弹出堆栈来调度它们,但我不认为该顺序是由任何事物保证。

    但是,在每种情况下,每个进程替换的标准输入都固定为命令的标准输出,这是任何其他进程替换刚刚运行的。换句话说,该命令最终类似于

    echo YES | { 
      read ssstr
      echo "3:$ssstr:three" | {
        read sstr
        echo "2:$sstr:two" | {
          read str
          echo "1:$str:one"
        }
      }
    }