【パイプ】

パイプ とは?

最終更新:
💡 コマンドとコマンドをつなぐ「水道管」、データが流れて次々と加工される

コマンドやプロセスの間でデータを受け渡す仕組み。Bashなどでは「|」で左のコマンドの標準出力を右の標準入力へつなぐ。PowerShellのパイプラインはオブジェクトを渡す。

📌 このページのポイント
Bash:標準出力を次の標準入力へgrep ERROR access.log | sort | uniq -caccess.logINFO startERROR DBERROR TIMEERROR DBgrep ERRORERROR DBERROR TIMEERROR DBuniq -c2 ERROR DB1 ERROR TIMEsortERROR DBERROR DBERROR TIME|:次の処理へ渡す
ログを読み、ERRORを含む行を抽出して並べ替え、隣り合う同じ行を数えるBashの例。矢印は入力と出力の流れです。PowerShellのコマンドレット間ではオブジェクトを渡します。
ひよこ ひよこ
パイプって「|」のことなの?
ペンギン先生 ペンギン先生
Bashなどでは、その記号でコマンドをつなぐよ。例えばgrep ERROR access.log | sortなら、ログからERRORを含む行を選び、その標準出力をsortの標準入力へ渡して並べ替えるんだ。通常の「|」では標準エラー出力は一緒に渡さないよ
ひよこ ひよこ
何個もつなげられるの?
ペンギン先生 ペンギン先生
例えばgrep ERROR access.log | sort | uniq -cなら、ERRORを含む行を抽出し、並べ替え、同じ行が何回あるか数えられる。uniqは隣り合った同じ行を扱うので、先にsortするんだ。日時などが違う行は別の行として数えるよ
ひよこ ひよこ
リダイレクトとの違いは?
ペンギン先生 ペンギン先生
パイプはコマンド同士の出力と入力をつなぐよ。リダイレクトは入出力先を変更する操作で、例えば「> result.txt」は標準出力をファイルへ書く。パイプの受け渡し自体に中間ファイルは不要だけれど、つないだコマンドが一時ファイルを使うことはあるんだ
ひよこ ひよこ
名前付きパイプは何が違うの?
ペンギン先生 ペンギン先生
LinuxのFIFOはファイルシステム上に名前を持つ特殊なファイルだよ。許可を持つプロセスがその名前を開いて通信できる。通常のパイプは名前を持たず、作った接続を子プロセスへ引き継ぐなどして共有する。直接の親子関係だけに限るという説明は正確ではないんだ
ひよこ ひよこ
パイプの中ではデータはどうなっているの?
ペンギン先生 ペンギン先生
Linuxでは容量のあるバッファを通るバイト列だよ。通常、空なら読み込み、満杯なら書き込みが待つけれど、非ブロッキング設定では動作が変わる。書き手が全て閉じて空になると読み手は終端を受け取る。容量は環境次第で、必ず64KBとは限らないんだ
ひよこ ひよこ
PowerShellの「|」も同じ?
ペンギン先生 ペンギン先生
結果を次へ渡す考え方は同じだけれど、PowerShellのコマンドレット間では文字列だけでなくオブジェクトを渡すよ。例えばファイル情報の名前やサイズを、プロパティとして次の処理で使える。Bashの標準入出力をつなぐ説明を、そのまま全てに当てはめないようにしよう
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「パイプ」って出てきたら「コマンドの結果を次のコマンドへ渡す仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「pipe」 = 管・パイプ
💬 pipeは管という意味。コマンド間を流れるデータを、水道管を通る水にたとえると理解しやすいよ

参考資料

← 用語集にもどる