我想知道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*
==> file-1 <== a_3 a_2 a_1 ==> file-2 <== a_1 a_2 ==> file-3 <== a_1
從結果來看,行程替換的執行順序似乎是:
在code1,3→2→1
在code2,3→1→2
在code3,(2→3或3→2)→1
我想知道訂單的規則。
有什么幫助嗎?
uj5u.com熱心網友回復:
Bash中行程替換的執行順序是否有規則
不,沒有規則。沒有同步。
Bash 產生(fork exec)行程。這些程序是完全獨立的,它們之間沒有同步。
有“生成順序”——管道的左側必須在右側之前啟動。但這不是執行的順序,只是“開始”的順序。
echo 'a_ ' | tee \ >(sed 's/ /1/g' > file-3) \ >(sed 's/ /2/g' > file-3) \ >(sed 's/ /3/g' > file-3) \ >/dev/null
讓我們嘗試繪制一棵行程樹。請注意,此樹中的每個“spawn”都會啟動一個新的并發未排序行程。
- 我們從主要的 bash 行程開始
- 生成管道右側的子外殼
- 為第一個 >(...) 生成子shell
- 打開 截斷檔案 file-3
- spawn sed 's/ /1/g'
- 為第二個 >(...) 生成子shell
- 打開 截斷檔案 file-3
- spawn sed 's/ /1/g'
- 為第三個 >(...) 生成子外殼
- 打開 截斷檔案 file-3
- spawn sed 's/ /1/g'
- 打開 截斷/dev/null
- 產卵三通
- 等待發球臺完成
- 等待第三個 >(...) 完成執行
- 等待第二個 >(...) 完成執行
- 等待第一個 >(...) 完成執行
- 為第一個 >(...) 生成子shell
- 為左側生成子外殼
- 產生回聲'a_'
- 等待回聲完成
- 等待左側子殼完成
- 等待右側子殼完成
- 生成管道右側的子外殼
樹的每個“分支”都是同時異步執行的。只有從同一級別開始的同一級別上的點才會順序發生。此外,父行程與子行程不同步——它們只等待行程完成整個執行,而不是完成特定操作。
每個單曲open truncate file file-3都沒有相互排序。一個>(...)可能完成整個執行,另一個甚至可能還沒有開始。沒有排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/515830.html
標籤:重击
下一篇:如何正確使用內部欄位分隔符?
