パイプの後にコマンドグループが来ると、正確に何が起こりますか?

パイプの後にコマンドグループが来ると、正確に何が起こりますか?

このような表現を見て、command1 | {command2;command3;command4}それが実際に何を意味するのか気になります。パイプ記号も​​知っており、{...}メインシェルの中かっこ内でコマンドを強制的に実行することも知っていますが、その組み合わせが何を意味するのか混乱しています。

答え1

パイプラインのさまざまな部分がどれほど複雑であるかは重要ではありません。必要に応じて、通常は別々のスクリプトで視覚化できます(特に、bashパイプラインの各部分がサブシェルで実行されるようなシェルではさらにそうです)。

スクリプト

command2
command3
command4

...どの(名目上、コマンドがサブシェルで実行されていないという事実{ command2; command3; command4; }に関係なく)、変換された入力は実行で提供されます。{ ...; }

command1

最初のスクリプトの3つのコマンドが実行する操作に応じて、1つ以上の入力を使用できます。1つcommand1以上の出力が生成されると、その出力はパイプラインの次の部分または端末のどこかに移動されます。または、パイプ出力がリダイレクトされます。

答え2

{...}デフォルトのシェルで中括弧で囲まれたコマンドを強制します。

これは中かっこが通常行うことを正しく説明しません。サブシェルを生成しないようにコマンドをラップします。つまり、中括弧自体はサブシェルを生成しません。中かっこで囲まれたコードは中かっこがないかのように同じシェルで実行されますが、中かっこで囲まれたコードは常にサブシェルで実行されます(したがって、リダイレクト、変数などは親シェルや他のシェルには影響しません。

中括弧の目的は、構文に単一のコマンドが必要な状況で複雑なコマンドを作成できるようにすることです。たとえば、内のcommand1 | { command2; command3; command4; }(スペースと最後のセミコロンが必要です)パイプの右側はです{ command2; command3; command4; }。コマンドは、then、thenを{ command2; command3; command4; }実行します。これらのコマンドはすべてパイプから入力を受け取ります。 (コマンドが実行され続けるため、実行後に残りの入力を取得するなどの操作が行われます。)command2command3command4command3command2

答え3

中かっこを名前のない関数として扱います。例えば

command234 () { command2; command3; command4; }

command1 | command234 

同じ結果を提供します。状況が複雑すぎると、名前付きグループが優先されます。テスト用なら。

答え4

標準出力は、command1標準入力から読み出しを開始するコマンドブロックの最初のコマンドに使用されます。ほとんどの場合、これはcommand2

関連情報