Linuxの現場でよく出てくる要件です。
これを実現するのがリダイレクト(リダイレクション)です。
リダイレクトを使いこなすことで、コマンドの入力元・出力先を自由に変更でき、
ログ収集・バッチ処理・シェルスクリプトの自動化が格段に楽になります。
この記事では、標準出力・標準エラー・標準入力の3つのストリームの概念から始まり、
`>`/`>>`/`<`/`2>`/`2>&1` 全パターンの実践例、
`/dev/null` の活用法、ヒアドキュメントまで体系的に解説します。
【この記事でわかること】
・> は上書き、>> は追記、< はファイルから入力(標準入力の切り替え)
・2> でエラー出力のみをファイルに保存、2>&1 で標準出力+エラーを一緒にリダイレクト
・> /dev/null 2>&1 で全出力を破棄(cronジョブ等でよく使われる)
・ヒアドキュメント(<
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
リダイレクトの前提:3つの標準ストリームとは
Linuxのコマンドは実行時に3つの標準ストリームを持っています。| 名称 | 略称 | ファイル記述子 | デフォルトの接続先 |
|---|---|---|---|
| 標準入力 | stdin | 0 | キーボード |
| 標準出力 | stdout | 1 | 画面(ターミナル) |
| 標準エラー出力 | stderr | 2 | 画面(ターミナル) |
リダイレクトとは、これらのストリームの接続先をファイル等に切り替える機能です。
標準出力と標準エラー出力は両方とも画面に表示されますが、別々の経路で出力されています。
この違いを理解することがリダイレクトを正しく使う基本です。
標準出力のリダイレクト(>と>>)
1. コマンド結果をファイルに保存する(>)
コマンドの実行結果をファイルに書き込むには、リダイレクト演算子 > を使います。$ ls > file.txt ← lsの結果をfile.txtに保存 $ cat file.txt Desktop cat1.txt file.txt meta www
・コマンドの出力結果は画面には表示されず、直接ファイルへ送られます
・ファイルが存在しなければ新規作成、既に存在する場合は上書きされます
2. ファイルに追記する(>>)
既存のファイルを上書きせず、末尾に追記するには >> を使います。$ ls -l >> file.txt ← lsの詳細結果をfile.txtに追記 $ cat file.txt Desktop cat1.txt file.txt meta www 合計 20 drwxrwxr-x 2 pakira pakira 4096 4月 28 2011 Desktop -rw-rw-r-- 1 pakira pakira 60 6月 23 19:08 cat1.txt -rw-rw-r-- 1 pakira pakira 35 11月 17 12:30 file.txt drwxrwxr-x 2 pakira pakira 4096 8月 10 10:52 meta drwxrwxr-x 2 pakira pakira 4096 4月 28 2011 www
> を使うと前の内容が消えてしまうため、ログが上書きされる事故につながります。
標準入力のリダイレクト(<)
1. ファイルをコマンドの入力として使う(<)
コマンドへの入力元をキーボードからファイルに切り替えるには < を使います。$ grep Desktop < file.txt > out.txt $ cat out.txt Desktop drwxrwxr-x 2 pakira pakira 4096 4月 28 2011 Desktop
その結果を out.txt に書き込んでいます。
標準エラー出力のリダイレクト(2>と2>>)
1. エラー出力のみをファイルに保存する(2>)
標準エラー出力をリダイレクトするには、ファイル記述子番号 2 を使います。$ cat /etc/noexist.txt 2> error.log $ cat error.log cat: /etc/noexist.txt: そのようなファイルやディレクトリはありません
正常な出力(標準出力)は画面に表示されたままで、エラーだけを分離できるのが特徴です。
2. エラー出力をファイルに追記する(2>>)
$ some_command 2>> error.log ← エラー出力をerror.logに追記
標準出力とエラー出力を同じファイルに保存する(2>&1)
1. 標準出力とエラー出力を同時にリダイレクト
2>&1 は「標準エラー出力(2)を標準出力(1)と同じ場所に送る」という意味です。# 標準出力とエラーを同じファイルに保存 $ ls /etc /nonexistent > output.log 2>&1 $ cat output.log ls: '/nonexistent' にアクセスできません: そのようなファイルやディレクトリはありません /etc: adjtime aliases ...
`> output.log 2>&1` が正しい順序です。逆の `2>&1 > output.log` は意図通りに動きません。
2. 追記の場合
$ some_command >> output.log 2>&1 ← 追記しながら両方まとめる
3. bash 4.0以降の簡略記法
$ some_command &> output.log ← > と 2>&1 をまとめた簡略記法 $ some_command &>> output.log ← 追記の簡略記法
/dev/null への出力破棄
`/dev/null` は特殊なデバイスファイルで、書き込まれたデータを全て破棄します。Windowsでいうゴミ箱(ただし復元不可)のようなものです。
1. 全出力を破棄する(cronジョブで多用)
# 標準出力もエラー出力も全て捨てる $ some_command > /dev/null 2>&1 # cronのジョブ設定でよく見る書き方 0 1 * * * /path/to/script.sh > /dev/null 2>&1
2. エラーのみ破棄、標準出力は表示
$ ls /etc /nonexistent 2> /dev/null /etc: adjtime aliases ... # エラーメッセージは表示されず、正常な出力だけ表示される
ヒアドキュメント(<<)
ヒアドキュメントは、シェルスクリプト内で複数行のテキストをコマンドへ渡す際に使います。終了文字列(EOFなど)が出現するまでの全ての内容が標準入力に渡されます。
1. 基本的な使い方
$ cat << EOF Linuxのリダイレクト学習中 標準出力と標準エラーの違いを理解する EOF Linuxのリダイレクト学習中 標準出力と標準エラーの違いを理解する
2. ファイルへの書き込みに使う
# 複数行のファイルを一気に書き込む $ cat << 'EOF' > config.txt HOST=localhost PORT=8080 LOG_LEVEL=info EOF # シングルクォートでEOFを囲むと変数展開が無効になる $ cat config.txt HOST=localhost PORT=8080 LOG_LEVEL=info
3. インデントを消したい場合(<<-)
# <<- を使うと先頭のタブ文字が除去される(スペースは除去されない) if true; then cat <<- EOF Line 1 Line 2 EOF fi
リダイレクト全演算子まとめ
| 書式 | 説明 |
|---|---|
| コマンド > ファイル | 標準出力をファイルに書き込む(上書き) |
| コマンド >> ファイル | 標準出力をファイルに追記する |
| コマンド < ファイル | ファイルの内容をコマンドの標準入力へ送る |
| コマンド 2> ファイル | 標準エラー出力をファイルに書き込む(上書き) |
| コマンド 2>> ファイル | 標準エラー出力をファイルに追記する |
| コマンド > ファイル 2>&1 | 標準出力と標準エラー出力をファイルに書き込む |
| コマンド >> ファイル 2>&1 | 標準出力と標準エラー出力をファイルに追記する |
| コマンド > /dev/null 2>&1 | 全出力を破棄する |
| コマンド &> ファイル | 標準出力+エラーをファイルに書き込む(bash簡略記法) |
| コマンド << 終了文字 | 終了文字が現れるまで標準入力に渡す(ヒアドキュメント) |
| コマンド1 | コマンド2 | コマンド1の標準出力をコマンド2の標準入力に渡す(パイプ) |
| コマンド1 2>&1 | コマンド2 | コマンド1の標準出力とエラーをコマンド2に渡す |
トラブルシュート:よくある間違い
2>&1 の順序を逆にしてしまう
# 間違い(エラーは画面に出てしまう) $ some_command 2>&1 > output.log # 正しい(標準出力もエラーも全てoutput.logに入る) $ some_command > output.log 2>&1
この時点では stderr はまだ画面を指しているため、エラーは画面に出てしまいます。
>> でなく > を使ってログが消える
# 危険:毎回上書きされてログが消える 0 * * * * /path/to/script.sh > /var/log/app.log # 安全:追記なのでログが蓄積される 0 * * * * /path/to/script.sh >> /var/log/app.log 2>&1
本記事のまとめ
リダイレクトはLinuxを使う上で必ず身につけるべき基礎技術です。特に次の3パターンは確実に覚えておきましょう。
・結果をファイルに保存:コマンド > ファイル(上書き)、コマンド >> ファイル(追記)
・エラーを分離保存:コマンド 2> error.log
・全出力を破棄:コマンド > /dev/null 2>&1
パイプ(|)と組み合わせることで、より高度なコマンド連携も実現できます。
パイプの詳細はパイプの使い方と活用例を参照してください。
シェルスクリプトでリダイレクトを活用する方法はシェルスクリプトの基礎で解説しています。
Linuxのコマンド操作を現場レベルで身につけたい方へ
リダイレクトをはじめとするLinuxの基礎コマンドを体系的に学ぶことで、サーバー運用・シェルスクリプト作成がぐっと楽になります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、「Linuxサーバー構築入門マニュアル(図解60P)」を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
