避免使用子 shell

程序替換的一個主要方面是它允許我們在從 shell 處理命令時避免使用子 shell。

這可以通過下面的簡單示例來證明。我當前資料夾中有以下檔案:

$ find . -maxdepth 1 -type f -print
foo bar zoo foobar foozoo barzoo 

如果我管道到 while / read 迴圈,增加一個計數器如下:

count=0
find . -maxdepth 1 -type f -print | while IFS= read -r _; do
    ((count++))
done

$count 現在確實包含 6,因為它是在子外殼上下文修改。下面顯示的任何命令都在子 shell 上下文中執行,並且在子 shell 終止後,其中使用的變數的範圍將丟失。

command &
command | command 
( command )

流程替換將通過避免使用管道|運算子來解決問題

count=0
while IFS= read -r _; do
    ((count++))
done < <(find . -maxdepth 1 -type f -print)

這將保留 count 變數值,因為沒有呼叫子 shell。