Bash

Bash:子程序和流水線

  • March 24, 2019

我的腳本的目的是計算file. 我知道我可以使用wc例如,但本練習的目的是了解 Linux 中的流程和管道。

在我的終端上執行的腳本:

C=0; cat file | while read line ; do C=$[ $C + 1 ] ; done ; echo $C

我總是得到0或我初始化C變數的任何數字。

在我的教科書中,他們解釋了這種行為,說每個管道都會創建一個新的子程序,它繼承所有父親變數,但是當孩子死時,父親仍然“看到”他的舊值。我同意。

我不明白的是,我只看到一個管道,在C=0; cat file和之間while read line ; do C=$[ $C + 1 ] ; done ; echo $C。所以我猜第二部分是由孩子(echo也是)執行的,那麼為什麼它會列印錯誤的值呢?孩子不應該增加C變數並列印正確的值,因為它屬於同一管道嗎?

我不明白的是,我只看到一個管道,在C=0; cat file和之間while read line ; do C=$[ $C + 1 ] ; done ; echo $C

不,這不是它解析的方式。你實際上有三個“管道”:

C=0
cat file | while read line ; do C=$[ $C + 1 ] ; done
echo $C 

(當然,第一個和第三個是退化的單命令管道,但從技術上講,它們仍​​然是那樣。管道是由控制運算符 ‘|’ 分隔的一個或多個命令的序列

換句話說,第一個和最後一個分號分隔管道。介於whiledone不之間的那些,因為它們是while 複合命令的一部分。

一個沒有任何復合命令的簡單範例:

$ echo hello | tr a-z x ; echo you | tr a-z y
xxxxx
yyy

在這裡,我們可以很容易地看到,只hello到第一個tr,只you到第二個tr,即分號分隔管道。

問題為什麼我的變數在一個’while read’循環中是本地的,而不是在另一個看似相似的循環中?包含多種方法來執行您嘗試執行的操作,以便能夠輸出C循環更新的值。

引用自:https://unix.stackexchange.com/questions/508338