避免使用子 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。