[Bash] リダイレクション

リダイレクション

コンピューティングにおいて、リダイレクト英語: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