変更要約: 初版(主題1.03・副主題1.03.1〜1.03.5に対応)
3.3ストリーム、パイプ、リダイレクトの使用
コマンドの入出力を自在につなぎ替える仕組みを学びます。標準入力・標準出力・標準エラー出力の3本のストリーム、リダイレクト(<・>・>>・2>&1)、パイプ(|)による連結、出力を引数に変える xargs、画面とファイルへ二股出力する tee を押さえます。
前節で揃えた道具をつなぐ配管がこの節です。すべてのコマンドは 標準入力(0)・標準出力(1)・標準エラー出力(2)という3本のストリームを持ち、これを付け替えるのがリダイレクト、コマンド同士を直結するのがパイプです。
3.3.1リダイレクトの基本
>=標準出力をファイルへ(上書き)/>>=追記/<=ファイルを標準入力に。- エラーだけ=
2> err.log/両方まとめて=command > all.log 2>&1(順序が重要:先に 1 をファイルへ→ 2 を 1 と同じ先へ)。 - 捨てたい出力は /dev/null へ(
2> /dev/null=エラーを非表示)。
3.3.2パイプ・xargs・tee
- パイプ(|)=左のコマンドの標準出力を右の標準入力へ直結(
ps aux | grep nginx)。標準エラーはパイプに乗らない(乗せるなら 2>&1 を先に)。 - xargs=流れてきたテキストを次のコマンドの引数に変換(
find . -name "*.tmp" | xargs rm)。「標準入力を読まないコマンド」に値を渡す橋渡し。 - tee=ストリームを画面(標準出力)とファイルの両方へ複製(
make 2>&1 | tee build.log)。-aで追記。
「上書き > と追記 >> の区別」「エラーも含めて保存=> file 2>&1」「パイプに乗るのは標準出力だけ」「引数化=xargs・二股=tee」 が最重要です。2>&1 > file(順序が逆=エラーは画面のまま)と > file 2>&1 の違いは 101 試験の名物ひっかけです。
> file 2>&1 の順序の意味を追いかけてみましょう。リダイレクトは左から右へ順に適用されます。まず > file で「1番(標準出力)→ file」に付け替え、次の 2>&1 は「2番(標準エラー)→ 今の1番と同じ場所=file」という意味になり、両方が file に入ります。逆に 2>&1 > file だと、まず「2番→今の1番=画面」に固定されてから 1番だけが file へ向かうため、エラーは画面に残ります。この「&1 はその時点の1番の複製」という理解が急所です。xargs が必要になる理由も仕組みで掴めます:rm は標準入力からファイル名を読まないので、find … | rm は動きません。find … | xargs rm が正解形で、対して grep のように標準入力を読むコマンドはパイプ直結で足ります。長いビルドの記録には command 2>&1 | tee log が定番=画面で進捗を見ながら完全なログも残せます。
| 記法 | 意味 | 典型用途 |
|---|---|---|
| > / >> | 標準出力を上書き/追記 | 結果の保存/ログ追記 |
| 2> / 2>&1 | エラーのみ/1と同じ先へ | エラー分離/全部まとめて保存 |
| | と xargs | 出力→入力/出力→引数 | grep 系へ/rm・mkdir 系へ |
| tee | 画面とファイルへ複製 | ビルドログの記録 |
ひっかけ: 「command 2>&1 > file で標準出力とエラーの両方が file に入る」は誤りです。この順序ではエラーは画面に残ります(正しくは > file 2>&1)。また「パイプは標準エラーも次のコマンドへ渡す」も誤り=パイプに乗るのは標準出力だけです。
3.3.3この節のまとめ
- 0=stdin/1=stdout/2=stderr。
>上書き・>>追記・両方保存は> file 2>&1(順序が命)・捨て先は /dev/null - パイプ=stdout→stdin 直結(stderr は乗らない)。引数に変えるなら xargs・画面とファイル両方なら tee
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. バッチ処理の標準出力と標準エラー出力の両方を result.log に保存したい。正しいコマンドは?
Q2. find で見つけた大量の一時ファイルを rm で削除したい。rm は標準入力からファイル名を読まない。適切なコマンドは?
Q3. 長時間のビルドの出力を、画面で確認しながら build.log にも記録したい。適切なコマンドは?

