リダイレクション
コンピューティングにおいて、リダイレクト(英語:Redirect)とはリダイレクションを行うこと。リダイレクションとは、様々なシェルを含むほとんどのコマンドラインインタプリタに共通の機能であり、標準ストリームをユーザで指定した位置に変更する機能のこと。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
標準ストリームは 標準入力 (stdin) 、 標準出力 (stdout) 、 標準エラー出力 (stderr) の3つです。
標準ストリームには、ファイルディスクリプタという番号が振られています。
ファイルディスクリプタ
ファイル記述子(ファイルきじゅつし、英語: file descriptor)とは、コンピュータプログラミングにおいてファイルへの参照を抽象化したキーである。ファイルディスクリプタあるいはFDとも呼ばれる。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
難しく説明されると良くわからなくなりますが、ファイル(の通り道)を区別する番号であると簡単に理解します。
Linuxでは全てがファイルなので、 標準入力 (stdin) 、 標準出力 (stdout) 、 標準エラー出力 (stderr) もファイルとして番号が振られます。ファイルディスクリプタはFDと略します。
FD | 名前 |
---|---|
0 | 標準入力 (stdin) |
1 | 標準出力 (stdout) |
2 | 標準エラー出力 (stderr) |
普段は全ての出力はターミナルに向いています。
FD | 名前 | |
---|---|---|
0 | 標準入力 (stdin) | キーボードから |
1 | 標準出力 (stdout) | 画面へ |
2 | 標準エラー出力 (stderr) | 画面へ |
STDOUTのリダイレクション
以下のコマンドを実行します。
$ command >file
このコマンドは以下と同じ意味です。
FD1、つまり標準出力の出力先をfileにするということを意味します。
$ command 1>file
FD | 名前 | |
---|---|---|
0 | 標準入力 (stdin) | キーボードから |
1 | 標準出力 (stdout) | fileへ |
2 | 標準エラー出力 (stderr) | 画面へ |
STDERRのリダイレクション
以下のコマンドを実行します。
$ command 2>file
FD2、つまり標準エラー出力の出力先をfileにするということを意味します。
FD | 名前 | |
---|---|---|
0 | 標準入力 (stdin) | キーボードから |
1 | 標準出力 (stdout) | 画面へ |
2 | 標準エラー出力 (stderr) | fileへ |
STDOUT・ STDERRのリダイレクション
以下のコマンドを実行します。
$ command &>file
これは下記のコマンドと同じ意味です。
$ command >&file
FD1とFD2 、つまり標準出力、標準入力ともに出力先をfileにするということを意味します。
FD | 名前 | |
---|---|---|
0 | 標準入力 (stdin) | キーボードから |
1 | 標準出力 (stdout) | fileへ |
2 | 標準エラー出力 (stderr) | fileへ |
以下のコマンドを実行します。
$ command >file 2>&1
このコマンドは、まず標準出力をファイルに出力します。
FD | 名前 | |
---|---|---|
0 | 標準入力 (stdin) | キーボードから |
1 | 標準出力 (stdout) | fileへ |
2 | 標準エラー出力 (stderr) | 画面へ |
続けて、2>&1
の部分は、FD2はFD1のコピーであることを意味します。
よって以下のように、標準エラー出力もfileに出力されます。
FD | 名前 | |
---|---|---|
0 | 標準入力 (stdin) | キーボードから |
1 | 標準出力 (stdout) | fileへ |
2 | 標準エラー出力 (stderr) | fileへ |
以下のコマンドを実行してみます。
$ command 2>&1 >file
command >file 2>&1
と似ていますが、全く結果はことなります。
最初は以下の状況です。
FD | 名前 | |
---|---|---|
0 | 標準入力 (stdin) | キーボードから |
1 | 標準出力 (stdout) | 画面へ |
2 | 標準エラー出力 (stderr) | 画面へ |
command 2>&1
を実行します。
FD | 名前 | |
---|---|---|
0 | 標準入力 (stdin) | キーボードから |
1 | 標準出力 (stdout) | 画面へ |
2 | 標準エラー出力 (stderr) | 画面へ |
続けて、>file
を実行します。
FD | 名前 | |
---|---|---|
0 | 標準入力 (stdin) | キーボードから |
1 | 標準出力 (stdout) | fileへ |
2 | 標準エラー出力 (stderr) | 画面へ |
よって標準出力はfileに、標準エラー出力はターミナルにそれぞれ出力されます。
出力を無視する
/dev/null
にリダイレクトすることで、出力結果を無視できます。
$ command > /dev/null
標準出力は捨てられてしまい、出力されません。
FD | 名前 | |
---|---|---|
0 | 標準入力 (stdin) | キーボードから |
1 | 標準出力 (stdout) | /dev/null |
2 | 標準エラー出力 (stderr) | 画面へ |
$ command >/dev/null 2>&1
$ command &>/dev/null
このように書けば、標準出力、標準エラー出力とも、出力されません。
FD | 名前 | |
---|---|---|
0 | 標準入力 (stdin) | キーボードから |
1 | 標準出力 (stdout) | /dev/null |
2 | 標準エラー出力 (stderr) | /dev/null |
stdinのリダイレクション
以下のように書くことで、 stdin へのリダイレクションを行います。
$ command ‹file
bashはコマンドを実行する前に、file を開こうとします。file を開けなかった場合は、error を出して終了し、command は実行されません。file が開けた場合は、開けたfile のファイルディスクリプタをコマンドへの標準入力のファイルディスクリプトとして使います。
FD | 名前 | |
---|---|---|
0 | 標準入力 (stdin) | fileから |
1 | 標準出力 (stdout) | 画面へ |
2 | 標準エラー出力 (stderr) | 画面へ |
例えば、標準入力から1行を読み込む read
にリダイレクションを使うことで、ファイルを読み込むことができます。
$ read -r line ‹ file