Linuxコマンドのリダイレクトは、コマンドの実行結果の入力先や出力先を変更する為の仕組みになります。
最初に出力先の変更について見ていくことにしましょう。
自作のLinuxコマンドのヘルプを充実させようまでで作成してきましたsayコマンドを例にして出力先の変更という操作を見ていきます。
確認の為にsayコマンド単体の実行結果を見ておきます。
$ say hello
hello
sayの後に指定した値が出力されました。
リダイレクトを利用して、sayの値の出力先をファイルにしてみます。
$ say hello > hello.txt
実行後に出力内容は生成されず、hello.txtが生成されています。
$ less hello.txt
hello
今回の実行のように出力内容がターミナル上からファイルへと変更されていて、この変更の操作をリダイレクトと呼びます。
続いて、入力先をリダイレクトしてみます。
$ cat < hello.txt
hello
catコマンドはファイルなどを指定して、ファイルの中身をターミナル上に出力(標準出力)します。
入力先のリダイレクトは下記のような処理を行うときに便利です。
$ tr 'a-z' 'A-Z' < hello.txt
HELLO
上記の処理はファイル内の文字列を読み取り、文字列内に含まれる小文字を大文字にして出力になります。
下記はリダイレクト一覧になります。
> | 出力のリダイレクト |
---|---|
>> | 出力をファイルに追記 |
< | 入力のリダイレクト |
<< | 入力終端文字の指定 |
2> | エラー出力をファイルに設定し、コマンドを実行 |
2>&1 | 標準出力とエラー出力をファイルに設定し、コマンドを実行 |
>/dev/null | 出力内容を破棄する |
>、>>、<や<<の説明は今まで触れた内容で理解できますが、1、2や&については今までの内容では一切触れていません。
簡単ではありますが、これらの数字の意味を見ていきます。
Linuxのコマンドは下記のように構成されています。
0 : 標準入力
1 : 標準出力
2 : 標準エラー出力
順不同になりますが、2の標準エラー出力から見ていきます。
下記のように意図的にエラーを出力してみます。
$ ls -e
ls: invalid option -- 'e' Try 'ls --help' for more information.
のようなエラーが出力されました。
このエラーをファイルに保存しておきたいとします。
標準エラー出力は2になりますので、
$ ls -e 2>e.txt
とすることで、標準エラー出力にある文字列をe.txtに挿入するということができます。
$ less e.txt
でe.txtを確認してみますと、
ls: invalid option -- 'e' Try 'ls --help' for more information.
が出力されました。
$ ls -i 2>e.txt
でエラーを発生させないようにコマンドを実行してみますと、e.txtの内容は空になります。
もう一つ確認として、標準出力の1の内容の保存を見ておきますと、
$ ls -i 1>r.txt
r.txtにはls -iの実行結果が保存されています。
2>&1について見てみます。
2は標準エラー出力で、1は標準出力になり、
$ ls -i >r.txt 2>&1
のように使用します。
上のコマンドでは ls -iが標準入力になり、標準出力の1はr.txtになります。
更に2>&1を加えることで、標準エラー出力の2の内容もr.txtに書き込むことになり、標準出力と標準エラー出力のどちらもr.txtに書き込むという処理になります。
標準出力と標準エラー出力は同時に出力されることは無いため、r.txtには標準出力か標準エラー出力のどちらか一方が書き込まれるということになります。
※&には複製を作るという意味があり、2>&1で1の複製を作ることになります。
>/dev/nullですが、これはコマンドの結果に対して何もしないという意味になり、簡単な例で処理を見ていくと、
$ say hello >/dev/null
を実行すると本来であれば、
hello
と出力されるところですが、何も表示されません。
.