Bash:サブプロセスとパイプ

Bash:サブプロセスとパイプ

私のスクリプトの目的はfilewc

私の端末で実行されるスクリプト:

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

私はいつも変数を0初期化する数字や何かを取得します。C

私の教科書では、各パイプに対してすべての親変数を継承する新しい子プロセスが作成されていますが、子が死んだ場合、父親はまだ以前の値を「見る」とこの動作について説明します。私は同意します。

C=0; cat file私が理解していないのは、間に1つのパイプしか見えないということですwhile read line ; do C=$[ $C + 1 ] ; done ; echo $C。それでは、2番目の部分echoも子によって実行されるようですが、なぜ誤った値が印刷されるのでしょうか。C同じパイプに属しているので、子が変数を増やして正しい値を印刷してはいけませんか?

答え1

C=0; cat file私が理解していないのは、間に1つのパイプしか見えないということですwhile read line ; do C=$[ $C + 1 ] ; done ; echo $C

いいえ、そう解釈されません。実際には3つの「パイプ」があります。

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

(もちろん、最初と3番目は縮退した単一命令パイプラインですが、技術的にはまだそうです。の順序1つ以上コマンドは制御演算子「|」で区切られます。)

つまり、最初と最後のセミコロンはパイプを区別します。その間にあるwhileからdonewhile 複合コマンド

複合コマンドを持たない簡単な例:

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

helloここでは、最初の項目にのみ移動し、tr2you番目の項目、つまりセミコロンで区切られたパイプにのみ移動することが簡単にわかりますtr

質問私の変数が1つの「読み込み中」ループではローカルですが、一見似ている他のループではローカルではないのはなぜですか?Cループから更新された値を出力できるように、実行したい操作を実行するためのいくつかのメソッドが含まれています。

関連情報