シェル・スクリプト・リファンレス |
コマンド集(機能別) | コマンド集(アルファベット順) | コマンド逆引き大全 | シェル・スクリプト・リファンレス |
リダイレクトとは |
シェルは「キーボードから入力し,画面に出力する」ようになっている。こうした入力と出力の方法を変更する場合には,リダイレクトを使う。たとえば,入力をファイルから行い,出力は捨ててしまう(画面への表示もファイルへの保存もしない)ということが可能だ。
リダイレクトには出力先を切り替える「>」,出力先のファイルに追加する「>>」,入力元を切り替える「<」,複数行の入力を行える「<<」がある。
ファイル・ディスクリプタ |
出力先や入力先の指定方法には,ファイル・ディスクリプタと呼ぶ数字を用いる。たとえば,特定のファイルへのアクセスをファイル・ディスクリプタの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< |
また,ファイル・ディスクリプタが0の場合は省略できる。
関連事項 |
>,<,>>,<<,リダイレクトの使い方 |