LinuxやMacのターミナル、WindowsのPowerShellなど、コマンドラインで作業をしていると、
たまに見かける「リダイレクト」「2>&1」という記号。
他の記事を読み漁りましたがいいのがなかったので
自分用に書いていますがよければご覧ください。
前提知識:「標準〇〇」について
コマンドを実行するとき、実は裏側では「入力」と「出力」が3種類に分かれています。(正確にはもっとあるかもしれません)
1. 標準入力(stdin)
- プログラムが受け取る情報
- 普通はキーボード入力
(例:cat
にファイル名を渡す)
2. 標準出力(stdout)
- プログラムの実行結果(成功)
- 普通は画面に表示される(ディスプレイという意味)
3. 標準エラー出力(stderr)
- エラーのメッセージ出力
- 普通は画面に表示される(ディスプレイという意味)
エラーなので標準出力とは分けて扱う
具体例で見る
cat hoge.txt
このコマンドで hoge.txt
の内容を表示したいとします。
ファイルの中に hogehoge
と書かれていれば、画面にこう表示されます:
hogehoge
これが **標準出力(stdout)**です。
そしてユーザが入力したcat hoge.txtが標準入力です。
では、hoge.txt
にアクセス権がなければどうなるか?
cat: hoge.txt: 許可がありません
このエラー文は 標準エラー出力(stderr) として扱われます。
そしてそれらの入出力には番号が割り振られています。:
出力内容 | 出力の種類 |
---|---|
キーボードからの入力 | 標準入力(0番) |
ファイルの中身 | 標準出力(1番) |
エラーメッセージ | 標準エラー出力(2番) |
こられを踏まえてまずリダイレクトの理解をする
リダイレクトとは「出力先の変更」です
通常、出力は画面に流れますが、それをファイルなど別の場所に送るのがリダイレクトです。
✔ 基本形
コマンド例 | 意味 |
---|---|
command > file.txt |
標準出力を file.txt に送る |
command 2> error.txt |
標準エラー出力を error.txt に送る |
このように2>とすることで標準エラー出力としてリダイレクトさせることができます。
(> は1>が隠れているということです。)
では 2>&1
って何?
ここからが本題。
some_command > all.log 2>&1
これがやっているのは、
「標準出力を
all.log
に出す」+「標準エラー出力も、同じくall.log
に出す」
同時に標準出力と標準エラー出力のリダイレクト先を設定しているということです。。
🔍 内訳を解説
表現 | 意味 |
---|---|
> |
出力をリダイレクト(ファイルに出す) |
2> |
標準エラー出力をリダイレクト |
&1 |
「ファイル記述子1(標準出力)の行き先と同じにする」 |
順番に注意!
some_command 2>&1 > all.log
これはエラーは画面に出て、出力だけファイルに行く
→ 順番を間違えると意図した結果にならない。
常にこう書くべし:
some_command > all.log 2>&1
よく使う形まとめ
コマンド | 意味 |
---|---|
command > out.txt |
標準出力をファイルに書き出す |
command 2> error.txt |
エラーだけ別ファイルに書き出す |
command > all.log 2>&1 |
出力もエラーもまとめて1つのファイルに保存 |
まとめ
1> = 標準出力の行き先を変える
2> = 標準エラー出力の行き先を変える
2>&1 = エラー出力の行き先を、標準出力と同じにする