2016-11-19 114 views
1

有人能解释一下这些工艺替代是如何工作的。这些过程替代如何工作?

(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'-换人得到FD 60, (从右到左)

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

所有违反两个重定向的方向。

它们是如何嵌套以及如何连接的? 让我发疯。 Ty。 Ty。

回答

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")

最后一个是实际施加到原始的一个命令;类似echo word >foo >bar >baz会创建所有三个文件,但echo的输出只能写入baz

同样,所有三个进程替换都开始一个新进程,但输出YES只写入最后一个之一。所以read ssstrecho YES得到它的输入。

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

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

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