シェル・スクリプト・リファンレス
コマンド集(機能別) | コマンド集(アルファベット順) | コマンド逆引き大全 | シェル・スクリプト・リファンレス

 リダイレクトとは

 シェルは「キーボードから入力し,画面に出力する」ようになっている。こうした入力と出力の方法を変更する場合には,リダイレクトを使う。たとえば,入力をファイルから行い,出力は捨ててしまう(画面への表示もファイルへの保存もしない)ということが可能だ。

 リダイレクトには出力先を切り替える「>」,出力先のファイルに追加する「>>」,入力元を切り替える「<」,複数行の入力を行える「<<」がある。


 ファイル・ディスクリプタ

 出力先や入力先の指定方法には,ファイル・ディスクリプタと呼ぶ数字を用いる。たとえば,特定のファイルへのアクセスをファイル・ディスクリプタの5に割り当てるといった具合だ。

 ファイル・ディスクリプタの0,1,2はシェルで予約されている。

 「0」は標準入力と呼ばれ,シェルにどのように入力するかを指定できる。通常はキーボードからの入力になっている。

 「1」は標準出力と呼ばれ,シェルの結果をどこに出力するかを指定できる。通常は画面への出力になっている。

 「2」は標準エラー出力と呼ばれ,シェルで実行時に発生したエラー・メッセージをどこに出力するか指定できる。通常は画面への出力になっている。

 また,出力先などを特定のファイル・ディスクリプタに送りたい場合は「&ファイル・ディスクリプタ」と指定すればよい。たとえば,エラーを表示したい場合は,


$ echo "Syntax Error" >&2 
Syntax Error         ←  標準エラー出力に書かれている

と入力すればよい。


 出力のリダイレクト「>」

 出力のリダイレクトは,シェルの処理結果やエラーなどをどこに出力するかを指定できる。出力のリダイレクトは以下のように記述する。


処理 ファイル・ディスクリプタ> 出力先

 たとえば,echoの出力をファイルに切り替えたい場合は,


$ echo "Nikkei Linux" 1> test 

と入力する。すると,「Nikkei Linux」という文字列がtestファイルに書き込まれる。ファイル・ディスクリプタが1の場合は省略可能である。


$ echo "Nikkei Linux" > test 

 標準エラー出力を表示したくない場合は,出力先を「/dev/null」にすればよい。


$ find / -name ".txt" 2> /dev/null 

 すると,findが発生するエラーは表示されず,検索結果のみが表示されるようになる。

 複数の出力先を別々に指定することもできる。


$  find / -name ".txt" > result 2> error 

 こうすると,検索結果はresultファイルに,エラーはerrorファイルに保存される。

 さらに,複数のディスクリプタをまとめることもできる。


$  find / -name ".txt" > /dev/null 2>&1 

 「2>&1」により,標準エラー出力は標準出力と同じ場所に記述される。


 追加のリダイレクト「>>」

 リダイレクトの「>>」を利用すると,出力先のファイルの末尾に追加して書き込むようになる。たとえば,


$ cat text.txt 
Nikkei Linux

のようなファイルがあった場合,出力のリダイレクトである「>」を利用すると,


$ echo "Shell Script" > text.txt 
$ cat text.txt 
Shell Script

のようにファイルに上書きされてしまう。

 そこで,追加のリダイレクト「>>」を利用すると,


$ echo "Shell Script" >> text.txt 
$ cat text.txt 
Nikkei Linux
Shell Script

のように,ファイルの末尾に処理結果を書き込むようになる。


 入力のリダイレクト「<」

 入力のリダイレクトは実行するコマンドやシェル・スクリプトなどに受け渡す方法を指定できる。入力のリダイレクトは以下のように記述する。


処理 ファイル・ディスクリプタ< 入力元

 通常はキーボードからの入力になっている。これを,ファイルの内容を入力したい場合は,


$ cat 0< text.txt 

とする。また,入力のリダイレクトのファイル・ディスクリプタが0の場合は省略できる。


$ cat < text.txt 


 ヒアドキュメント「<<」

 比較的長い文などをキーボードから入力したい場合に利用できるのが,ヒアドキュメントだ。ヒアドキュメントは以下のように記述する。


処理 ファイル・ディスクリプタ<<入力終端

 入力終端には,入力を終わらせたい時に入力する文字列を指定する。たとえば,入力した文字列をソートしたい場合は,


$ sort 0<
> Tajima 
> Fukuda 
> Aso 
> EOF    ←  ここで入力終了
Aso        ←  ソートの結果が表示される
Fukuda
Tajima

 また,ファイル・ディスクリプタが0の場合は省略できる。