Bash:子程序和流水線
我的腳本的目的是計算
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
(當然,第一個和第三個是退化的單命令管道,但從技術上講,它們仍然是那樣。管道是由控制運算符 ‘|’ 分隔的一個或多個命令的序列)
換句話說,第一個和最後一個分號分隔管道。介於
while
和done
不之間的那些,因為它們是while
複合命令的一部分。一個沒有任何復合命令的簡單範例:
$ echo hello | tr a-z x ; echo you | tr a-z y xxxxx yyy
在這裡,我們可以很容易地看到,只
hello
到第一個tr
,只you
到第二個tr
,即分號分隔管道。問題為什麼我的變數在一個’while read’循環中是本地的,而不是在另一個看似相似的循環中?包含多種方法來執行您嘗試執行的操作,以便能夠輸出
C
循環更新的值。