2016-11-19 16 views
1

誰かがのプロセス置換がどのように機能しているか説明してください。これらのプロセス置換はどのように機能しますか?

(echo "YES")> >(read str; echo "1:${str}:first";)> >(read sstr; echo "2:$sstr:two")> >(read ssstr; echo "3:$ssstr:three") 

出力

1:3:2 YES:3:2:最初の

私は、「ssstr'置換がFD 60得たことを、考え出しました(右から左へ)

しかし、FD60の入力にどのように(エコー "YES")接続し、入力FD61などでFD60を出力し、最後にFD62がターミナルに出力されますか?

すべてが2つのリダイレクトの方向に反対しています。

どのようにネストされ、どのように接続されていますか? 私は夢中になります。 Ty。

答えて

2

まず第一には、実際にこのようなコードを書いていない:)

プロセス置換が構造>(...)あります。 (...)>は特定の構成ではありません。出力リダイレクションに続くサブシェルです。

この例では、3つの出力リダイレクション

  1. > >(read str; echo "1:${str}:first";)
  2. > >(read sstr; echo "2:$sstr:two")
  3. > >(read ssstr; echo "3:$ssstr:three")

最後のものは、実際には元に適用されるものである、続いて単一のコマンド(echo "YES")ありますコマンド; echo word >foo >bar >bazのようなものは3つのファイルすべてを作成しますが、echoの出力はbazにのみ書き込まれます。

同様に、3つのプロセス置換はすべて新しいプロセスを開始しますが、出力YESの最後のにのみ書き込まれます。したがってread ssstrecho YESから入力を取得します。

この時点では、何が未定義の動作になるかを見ていると思います。 3つのプロセスの置換は、OSが作成したのと逆の順序で実行されます。つまり、OSが各プロセスをスタックにプッシュして、次のプロセスが作成されたときに、プッシュします何でも保証されています。

それぞれの場合、各プロセス置換の標準入力は、コマンドの標準出力に固定されています。これは、実行されたばかりのプロセス置換のどれかです。つまり、コマンドは

echo YES | { 
    read ssstr 
    echo "3:$ssstr:three" | { 
    read sstr 
    echo "2:$sstr:two" | { 
     read str 
     echo "1:$str:one" 
    } 
    } 
} 
と同様になります。
関連する問題