このような表現を見て、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; }
実行します。これらのコマンドはすべてパイプから入力を受け取ります。 (コマンドが実行され続けるため、実行後に残りの入力を取得するなどの操作が行われます。)command2
command3
command4
command3
command2
答え3
中かっこを名前のない関数として扱います。例えば
command234 () { command2; command3; command4; }
command1 | command234
同じ結果を提供します。状況が複雑すぎると、名前付きグループが優先されます。テスト用なら。
答え4
標準出力は、command1
標準入力から読み出しを開始するコマンドブロックの最初のコマンドに使用されます。ほとんどの場合、これはcommand2
。