「リダイレクト」とは出力の向かう先を変更することだ。
Linuxの場合、コマンドの結果表示を画面に表示するのではなく、ファイルに保存するときなどで使うことが多い。
リダイレクトにもいくつかの種類があるので、種類と共に使い方をご紹介していこう。
目次
リダイレクトとは?
リダイレクトの基本
一般的にリダイレクトというとWebページで使うことが多い。あるページに移行したときに、強制的に別ページに飛ぶことをリダイレクトという。ページのURLを変えたときや、会社の変更によりドメインが変わったなどでよく使われる。
Linuxでは基本的に標準出力や標準入力、標準エラー出力その「向かう先を変更する」ことを意味している。
標準出力というのは、コマンドを打ったときに画面に表示されるもののことだ。下記でいうと2行目の「Hello_World」の部分が標準出力になる。
標準入力はそのまま入力だ。上でいうと「echo Hello_World」だ。標準エラー出力は、エラーが発生したときに表示されるエラーメッセージを指す。
リダイレクトが使われるとき
「標準出力をファイルへ出力する」ときに使用することが多い。つまり、「画面に出力される文字列をファイルへ保存できる」と考えればわかりやすいだろう。
コマンドラインでは画面は文字列で大量に埋め尽くされる。なにもしなければ、結果が上へ画面外へどんどん流れていってしまう。
「結果を確認しようと思っても確認できない」という状況が発生する。そのようなときはパイプでページャ(lessコマンド)などに繋いで、閲覧するかもしくは、今回紹介するリダイレクトという手段を使いファイルに結果を保存閲覧するとよいだろう。
ほかパイプラインで出力結果を加工したあとに最終的にファイルへその出力を保存したいときもリダイレクトは使われる。
「標準入力」「標準出力」「標準エラー出力」
上でも述べたがLinuxに限らず大概のOSには「標準入力」「標準出力」「標準エラー出力」この三つが備え付けられていることがほとんどだ。
OSが入出力を識別するための「割り振り番号」識別子がついていて、Linuxではデフォルトで
- 標準入力には0
- 標準出力には1
- 標準エラー出力には2
が割り振られている。「3番以降」はファイルをオープンしたときなどプログラマが指定してディスクリプタをオープンできるようになっている。
今回は詳しく理解しなくても問題ない。0が入力、1が出力、2がエラーという番号と関連づけが理解できていれば大丈夫だ。
リダイレクトを実際にやってみよう
簡単な例をあげてみるとechoコマンドで標準出力、つまり画面に文字列を表示してみよう。
標準出力のリダイレクト
$ echo Hello_World
すると以下のように結果が表示されるはずだ。
これをリダイレクトしてみよう
$ echo Hello_World > Test_Hello_World.txt
としてみる。
するとコンソールや端末には何も表示されずにプロンプトがもどってくるはずだ。なにも表示されないが、これで正常に動作している。次に
$ cat Test_Hello_World.txt
としてみよう、以下のように内容が表示されるはずだ。
今標準出力を「Test_Hello_world.txtにリダイレクト」したことになる。リダイレクト先のファイルが存在しないときは自動的にファイルが生成される。結果がTest_Hello_world.txtに書き込まれているのがわかる。今度は
$ echo Close_World > Test_Hello_World.txt
としてみよう、そして
$ cat Test_Hello_World.txt
としてみると以下のようになる。
さきほど「Hello_World」とリダイレクトで流しこんだテキストが上書きされているのがわかる。しかし上書きではなく出力結果を追加したいときも多いだろう。そういうときは「>>」を使う。
$ echo Hello_World > Test_Hello_World.txt
そして
$echo Close_World >> Test_Hello_World.txt
としてみよう、後に
$ cat Test_Hello_World.txt
とすると下記のように文字列が追加記述されているのが確認できる。
これで標準出力をファイルへリダイレクトできるようになった。
標準エラー出力のリダイレクト
次は「標準エラー出力をリダイレクト」してみよう、試しにls コマンドで実在しないファイルを指定するとエラー出力が返ってくる。これを普通にリダイレクトしてみる。
$ ls aaa > Test_File.txt
端末にメッセージが表示されTest_File.txt をlessやcatで中身をみてもマッサラだ。
なぜか?「標準エラーの出力と標準出力はディスクリプタ(上で説明した番号だと思えばいい)が異なる」からだ。標準エラー出力をリダイレクトする場合
$ ls aaa 2> Test_File.txt
となる、中身を確認すると以下のようになっている。標準エラー出力である「2」をリダイレクトしている。
$ cat Test_File.txt
リダイレクトの前にディスクリプタ番号を指定すると指定したディスクリプタをリダイレクトできる。
今リダイレクトしたのは2番標準エラー出力だ。また「&」を追加すると出力先を同一にできる。わかりにくいが「2>&1」という表現をすると「2の出力を1と同一にする」ということになる。
出力情報の破棄
他、リダイレクト先を/dev/nullにしていると出力情報を破棄できる。「/dev/null」はいわばゴミ箱と考えていい。
ときおり標準出力も標準エラー出力も破棄したいときがある。スクリプトを実行する段階で既知のエラー出力を無視したい場合などだ、この場合
$ <command> >/dev/null 2>&1
で実現できる。
「commandの標準出力をゴミ箱へながし標準エラー出力も標準出力と同一のゴミ箱へ」という意味になる。少々ややこしい記述だが使う場面はあるので、この文法を丸暗記してしまっても構わない。
入力のリダイレクト
出力のリダイレクトについて長くなったが、入力のリダイレクトも可能だ。「<」と「<<」をつかう、<はコマンドの標準入力にファイルを流しこむイメージでいいだろう。
$ grep "test" < testfile.txt
とするとtestfile.txtからtestという文字列を探しだしてくれる。
終了文字
<<を使うと終端文字列を指定して標準入力を流しこむことができる。
$ cat << "EOF" > testfile.txt
とするとEOFと入力するまで標準入力をうけつけ,最終的にその結果をtestfile.txtにリダイレクトする。
リダイレクトの種類まとめ
最後にリダイレクトの種類をまとめてご紹介しておこう。
コマンド > ファイル | コマンド結果をファイルへ書き込む |
コマンド < ファイル | ファイルの中身をコマンドの標準入力へ |
コマンド >> ファイル | コマンドの出力結果をファイルへ追記 |
コマンド 2> ファイル | エラー出力をファイルへ書き込む |
コマンド 2>> ファイル | ファイルにエラー出力を追記 |
コマンド > ファイル 2>&1 | ファイルに標準出力と標準エラー出力を書き込む |
コマンド >> ファイル 2>&1 | ファイルに標準出力と標準エラー出力を追記 |
コマンド << 終了文字 | 終了文字が現れるまで標準入力へ送る |
コマンド &> ファイル | 標準出力と標準エラー出力を同じファイルに書き込む |
コマンド > /dev/null 2>&1 | 表示をしない。(表示をゴミ箱へ) |
まとめ
このページではLinuxのリダイレクトについて使い方をまとめてご紹介した。
リダイレクトはLinuxをCUIで扱う上で、必ず覚えておきたいものだ。システムに影響するものでもないため、積極的に色々と試してみていただきたい。
とても丁寧かつ分かりやすい説明でした!
大変嬉しいコメントありがとうございます。