【Linux】リダイレクション

2019年3月10日

標準出力と入力には、一般的に画面(端末)、キーボードが割り当てられていますが、実行結果をファイルに保存したり、既存ファイルの内容を入力に割り当てることも出来ます。入力元や出力先をコントロールするのに使われるのがリダイレクションです。

リダイレクション

実行結果を画面ではなく、ファイルに保存したい場合や、コマンドへの入力にファイルを使う場合などコマンドへの入力元や出力先を切り替えるのがリダイレクションです。

実行結果を標準出力からファイルに保存したい場合は「>」を使います。

コマンド > ファイル 出力元を画面からファイルに切り替え
[root@hostname /]#
ls -l > list.dat

ファイルに上書きしないで、既存ファイルの末尾に追記する場合は「>>」を使います。

コマンド >> ファイル 出力内容をファイルに追加・挿入
[root@hostname /]#
ls -l >> list.dat

標準入力を切り替えるには、「<」を使います。

コマンド < ファイル 入力元をキーボードからファイルに変換する
[root@hostname /]#
grep to < member.txt

標準エラー出力をリダイレクトするには、「2>」を使います。エラーだけをファイルで保存して置きログとして残しておくことが出来ます。

コマンド 2> ファイル ファイルにエラーを書き込む
コマンド 2>> ファイル 既存ファイルにエラーを追記・挿入
[root@hostname /]#
php cmd.php 2> error.log

コマンドを実行した際の標準出力、標準エラー出力のどちらも画面、ファイルに表示しない場合には以下のように記述します。

コマンド > /dev/null 2>&1

「/dev/null」ファイルは特殊なデバイスファイルで、入力されたデータを消し、このファイルを読み込むとEOF(End Of File)が返ります。

リダイレクションの前半部分「コマンド > /dev/null」は、標準出力を「/dev/null」に切り替えます。

後半部分の「2>&1」は、標準エラーの出力先を切り替えた出力先(/dev/null)に設定しています。

構文
書式説明
コマンド > ファイル 2>&1ファイルに出力とエラーを書き込む
コマンド >> ファイル 2>&1既存ファイルに出力とエラーを追記・挿入
コマンド << EOF終端文字が現れるまで標準入力へ送る
コマンド1 | コマンド2コマンド1の標準出力をコマンド2の標準入力に渡す
コマンド1 2>&1 | コマンド2コマンド1の標準出力と標準エラー出力をコマンド2の標準入力に渡す
コマンド1 | tee ファイル | コマンド2コマンド1の標準出力をコマンド2の標準入力に渡すとともにファイルに書き込む
コマンド &> ファイル標準出力と標準エラー出力を同じファイルに書き込む

コマンド連結実行

複数のコマンドを続けて実行する場合は、「;」を使います。

コマンドを「;」で区切った場合は、最初のコマンドが正常に終了するしないにかかわらず、次のコマンドを実行します。

コマンド1 ; コマンド2 コマンド1に続いてコマンド2を実行する
[root@hostname /]#
pwd ; ls -la
カレントディレクトリの絶対パスとカレントディレクトリ内にあるファイル・ディレクトリを表示する

最初のコマンドの実行結果に応じて次のコマンドの実行を制御したい場合は、「&&」、「||」を使用します。

「&&」の場合、最初のコマンドが正常終了(0)したときにだけ次のコマンドが実行されます。

コマンド1 && コマンド2 コマンド1が正常終了したら、コマンド2を実行
[root@hostname /]#
rmdir test && ls -la
testディレクトリを削除出来たら、カレントディレクトリ内にあるファイル・ディレクトリを表示する

「||」の場合は、最初のコマンドが正常に終了しなかった(0以外)ときにだけ次のコマンドが実行されます。

コマンド1 || コマンド2
[root@hostname /]#
cat temp || echo "error"
tempファイルがあれば内容を表示、無い場合は「error」と表示する

コマンドが正常に終了したか否かを確認したい場合は、「echo $?」で確認が出来ます。

正常に終了した場合は0を、そうでない場合は0以外の数値になります。

その他の実行制御
コマンド 説明
( コマンド1 ; コマンド2 ) ひとまとめにしてコマンドを実行する
{ コマンド1 ; コマンド2 } 現在のシェル内でコマンドを実行する