我想知道在Bash中是否存在进程替换的执行顺序规则。
让我们假设下面有3个代码。唯一的区别是重定向和输出文件名。
Bash版本为5.0.17
电码
# code1
echo 'a_ ' | tee \
>(sed 's/ /1/g' >> file-1) \
>(sed 's/ /2/g' >> file-1) \
>(sed 's/ /3/g' >> file-1) \
>/dev/null
# code2
echo 'a_ ' | tee \
>(sed 's/ /1/g' > file-2) \
>(sed 's/ /2/g' >> file-2) \
>(sed 's/ /3/g' >> file-2) \
>/dev/null
# code3
echo 'a_ ' | tee \
>(sed 's/ /1/g' > file-3) \
>(sed 's/ /2/g' > file-3) \
>(sed 's/ /3/g' > file-3) \
>/dev/null结果
head file*==>文件-1 <== a_3 a_2 a_1 ==>文件-2 <== a_1 a_2 ==>文件-3 <== a_1
从结果来看,进程替换的执行顺序似乎是:
在code1,3→2→1
在code2,3→1→2
在code3,(2→3或3→2)→1
我想知道秩序的规则。
有什么帮助吗?
发布于 2022-10-15 09:44:32
如果在Bash中存在进程替换的执行顺序规则,则为
。
不,没有规则。没有同步。
Bash生成(叉+执行)进程。这些进程是完全独立的,它们之间没有同步。
有“产卵顺序”--管道的左侧必须在右侧之前启动。但这不是执行的顺序,而是“开始”的顺序。
a_ 'a_‘> tee \ >(sed 's / 1/g’>文件-3)\ >(sed 's / 2/g‘>文件-3) >(sed 's / 3/g’>文件-3)\ >/dev/null
让我们尝试绘制一棵进程树。请注意,此树中的每个“产卵”将启动一个新的并发未排序进程。
我们从我们的主要bash进程开始,在管道的右侧为第一个>(.)
的
- spawn subshell for the second >(...)
- open+truncate file file-3
- spawn sed 's/ /1/g' - spawn subshell for the third >(...)
- open+truncate file file-3
- spawn sed 's/ /1/g' - open+truncate /dev/null
- spawn tee
- wait for tee to finish
- wait for the third >(...) to finish execution
- wait for the second >(...) to finish execution
- wait for the first >(...) to finish execution- spawn subshell for the left side
- spawn echo 'a\_ '
- wait for echo to finish- wait for left side subshell to finish
- wait for right side subshell to finish树的每个“分支”都是异步并发执行的。只有同一水平上的点从同一水平开始依次发生。此外,父进程不与子进程同步--它们只等待进程完成整个执行,而不是完成特定的操作。
并不是每一个open+truncate file file-3都与另一个进行排序。一个>(...)可能完成整个执行,另一个甚至可能没有启动。没有测序。
https://stackoverflow.com/questions/74078328
复制相似问题