首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash中进程替换的执行顺序

Bash中进程替换的执行顺序
EN

Stack Overflow用户
提问于 2022-10-15 09:41:34
回答 1查看 44关注 0票数 0

我想知道在Bash中是否存在进程替换的执行顺序规则。

让我们假设下面有3个代码。唯一的区别是重定向和输出文件名。

Bash版本为5.0.17

电码

代码语言:javascript
复制
    # 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

结果

代码语言:javascript
复制
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

我想知道秩序的规则。

有什么帮助吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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进程开始,在管道的右侧为第一个>(.)

  • open+truncate文件-3
  • 派生sed s/ /1/g'

  • 产卵子sed生成子sed。

代码语言:javascript
复制
    - spawn subshell for the second >(...) 
        - open+truncate file file-3
        - spawn sed 's/ /1/g'
代码语言:javascript
复制
    - spawn subshell for the third >(...) 
        - open+truncate file file-3
        - spawn sed 's/ /1/g'
代码语言:javascript
复制
    - 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
代码语言:javascript
复制
- spawn subshell for the left side 
    - spawn echo 'a\_ '
    - wait for echo to finish
代码语言:javascript
复制
- wait for left side subshell to finish
- wait for right side subshell to finish

树的每个“分支”都是异步并发执行的。只有同一水平上的点从同一水平开始依次发生。此外,父进程不与子进程同步--它们只等待进程完成整个执行,而不是完成特定的操作。

并不是每一个open+truncate file file-3都与另一个进行排序。一个>(...)可能完成整个执行,另一个甚至可能没有启动。没有测序。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74078328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档