有人可以解释这些流程替换的工作原理。
(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。
答案 0 :(得分:2)
首先,实际上不要写这样的代码:)
流程替换是构造>(...)
。 (...)>
不是特定的构造;它只是一个子shell,后跟输出重定向。
此示例是单个命令(echo "YES")
,后跟三个输出重定向
> >(read str; echo "1:${str}:first";)
> >(read sstr; echo "2:$sstr:two")
> >(read ssstr; echo "3:$ssstr:three")
最后一个是实际应用于原始命令的那个; echo word >foo >bar >baz
之类的内容会创建所有三个文件,但echo
的输出只会写入baz
。
同样,所有三个进程替换都会启动一个新进程,但输出YES
仅写入 last 。因此read ssstr
从echo YES
获取其输入。
此时,我认为你看到的是未定义的行为。三个进程替换以它们创建的相反顺序运行,就好像操作系统在创建下一个进程时将每个进程推送到堆栈,然后通过将它们弹出堆栈来调度它们,但我不认为该顺序是由任何事物保证。
但是,在每种情况下,每个进程替换的标准输入都固定为命令的标准输出,这是任何其他进程替换刚刚运行的。换句话说,该命令最终类似于
echo YES | {
read ssstr
echo "3:$ssstr:three" | {
read sstr
echo "2:$sstr:two" | {
read str
echo "1:$str:one"
}
}
}