Linuxのリダイレクトの使い方と種類!標準出力・入力・エラーやパイプについても解説
Linuxでは、画面に出力される内容をファイルに出力したり、逆にキー入力の代わりにファイルから入力させたりするときには、「>」もしくは「<」を使うリダイレクトを使用します。本記事では、Linuxで非常によく使う、このリダイレクトについて説明します。
目次
Linuxのリダイレクトについて
Linuxのコマンドラインで非常によく使われるのが「リダイレクト」です。Linuxのコマンド例では、よくコマンドの後に「<」「>」という不等号が出てきますが、これがリダイレクトです。
- echo It's applica site. > applica.txt
なお、本章ではこのリダイレクトについての説明を行ないますので、説明は不要ですぐにリダイレクトの使い方を知りたい場合は、目次から「Linuxでのリダイレクトの使い方」へ進んでください。
リダイレクトとは何か
「リダイレクト」は「redirect」つまり「別な方向に(ものを)送る」という意味で、Linuxでは入力・出力先を変更するという意味で使われます。
リダイレクトの基本
いま、Linuxではリダイレクトは、入力・出力先を変更するという意味で使われると説明しました。しかし、それだけではいったい何をどう変更するのか、想像しづらいこととでしょう。Linuxでは、基本的に標準出力や標準入力、標準エラー出力がリダイレクトの対象になり、多くの場合は変更された入力・出力先はファイルとなります。
突然「標準入力」「標準出力」「標準エラー」という単語が出てきて戸惑う方もおいででしょうが、これについて次の章にて説明します。いまのところ、
- 標準入力………キーボードで入力したもの
- 標準出力………コマンドを打つと画面に表示される出力結果
- 標準エラー……間違ったコマンドを打った結果表示されるエラーメッセージ
だと思っておいてください。
ファイルデスクリプタの割り振り番号
Linuxでは、キーボード入力や画面への出力も、ファイル入力・ファイル出力の一形態として扱われます。そのため、これらに対してもファイルとしての識別子、ファイルデスクリプタ(FD)の番号が充てられています。
- 標準入力………0
- 標準出力………1
- 標準エラー……2
現時点では、そういう番号があるのだな、ということだけ覚えておいてください。このファイルデスクプタの番号は次の章の「標準エラー出力について」の節で、また出てきます。
使用する主な場面
それでは、この章の最後にリダイレクトが使われる主な場面を紹介します。
コマンドの結果表示をファイルに保存
Linuxでリダイレクトが一番多く使われるシチュエーションは、「標準出力をファイルに出力する」場合です。言い換えると、「画面に出力される文字列をファイルへ保存する」場合です。Linuxの通常の使用方法では、コマンドを入力すると、その結果が画面上にあふれてしまい、コマンドの結果が画面の上へ、画面外へとどんどん流れ出てしまいます。
そのため、コマンドの結果を確認しようとするには、Linuxでは一般にリダイレクトでファイルに結果を保存して、それをあとからcatやlessを使って確認するか、のちほど「Linuxでのリダイレクトのパイプについて」の章で紹介する、パイプを経由してlessコマンドなどへ繋いで確認することになります。
パイプラインでの出力結果を加工して保存
同様に最終的にはファイルに出力する際に使われるのですが、「標準出力」ではなく、「パイプラインの出力結果」をファイル出力する際にもリダイレクトはよく使われます。突然パイプラインと言われても困るでしょうが、これはLinuxの1行コマンドで、複数のコマンドをのちほど紹介する「パイプ」で連結してひとつのコマンドのように操る術です。
このパイプラインの出力結果もやはり標準出力に出力されますので、放っておくと画面外へとあふれてしまいます。そこで、パイプラインの出力結果もほとんどの場合、リダイレクトを用いてファイルに出力することになります。
Linuxでのリダイレクトの使い方
それでは、いよいよ本章からはLinuxで実際にリダイレクトを扱う使い方について、「標準出力」「標準エラー出力」「標準入力」の3つに分けて説明します。
標準出力について
まずは、Linuxの標準出力をリダイレクト経由でファイルに出力する方法をお教えします。わかりやすく、引数をそのまま標準出力に出力するechoコマンドを使って説明します。まず、普通にechoコマンドを使って「Here is applica.」と表示するために、「echo Here is applica.」と入力します。すると、標準出力に「Here is applica.」と返ってきます。
ファイルが存在しない場合は新規作成
それでは、今度はリダイレクトを使って標準出力をファイルに書き出します。いま、このようにフォルダだけしかないディレクトリにいる状態で、リダイレクトを使ってみます。
さきほどの「echo Here is applica.」のコマンドを、「applica.txt」にリダイレクトして「echo Good bye applica. > applica.txt」と入力します。
すると、さきほどとは異なり、画面にはなにも表示されません。そこでlsコマンドでディレクトリ内を確認すると、applica.txtが増えているのがわかります。
catコマンドで中身を確認すると、標準出力されるはずだった「Here is applica.」の文字列がapplica.txt内に収められているのがわかります。
このように、リダイレクトを使うことで、ファイルが存在しない場合は標準出力の内容が収められたファイルが新規作成されます。
既存ファイルがある場合は上書きor追加記述
つづいて、リダイレクトしたのと同名の既存ファイルがある場合はどうなるのかをお教えします。先のapplica.txtがある状態で、今度は「echo Good bye applica. > applica.txt」と入力します。そしてcatでapplica.txtの中身を確認すると、中身が「Good bye applica.」に書き変わっています。
つまり、「>」でリダイレクトすると、既存ファイルを上書きしてしまうのです。しかし、場合によっては上書きではなく、追記をしたい場合もあります。その場合には「>>」のリダイレクトを使用します。今度、まず「echo Here is applica. > applica.txt」としてapplica.txtを作成したあとで、「echo Good bye applica. >> applica.txt」と入力し、applica.txtの中身を確認します。
すると、「>>」のリダイレクトで新たな1行が追記されたのが確認できます。以上が、標準出力のファイルへのリダイレクト方法です。
標準エラー出力について
標準出力と同様に、エラー出力もファイルにリダイレクトできると便利です。Linuxではエラーもコマンドの出力結果と同様画面に出力されますから、同じようにリダイレクトできるように思えます。
ところが、エラーコードを吐き出すように、存在しないファイルをlsで指定して「ls test.txt > applica.txt」とapplica.txtにリダイレクトさせえても、普通にエラーコードが画面に表示されるだけで、applica.txtにはなにもリダイレクトされていません。
実はエラーコードは、標準出力同様画面に表示されますが、標準出力ではなく「標準エラー出力」という形で画面に出力されるのです。そのため、エラーコードをファイルにリダイレクトさせるには、「ls test.txt 2> applica.txt」と先に「ファイルデスクリプタの割り振り番号」の節で説明したように、FDの番号の「2」を明示的に指定する必要があります。
なお、このとき「2>」ではなく、「2 >」と2の後ろにスペースを空けると、「2」がコマンドの引数とされてしまいますので注意してください。
ヌルデバイスへの破棄について
この標準出力や標準エラー出力の出力情報については、Linuxに慣れてくると「わかっているから表示しなくていいよ」と思うようになります。そんなときにはゴミ箱代わりになるヌルデバイスの「/dev/null」にリダイレクトすることで、出力情報を破棄できます。たとえば、下図のようにヌルデバイスにリダイレクトすれば、標準出力が破棄されます。
標準エラー出力の場合も同様に「2> /dev/null」とすれば、標準エラー出力を破棄できます。さらに、
- [コマンド] >/dev/null 2>&1
とすれば、標準出力も標準エラー出力もヌルデバイスにリダイレクトして、表示させないようにできます。なお、上の文の「&1」は直前の「/dev/null」を引いてきており、
- [コマンド] > /dev/null 2>/dev/null
と同じ文を意味します。
標準入力について
ここまで画面に出力される出力情報をリダイレクトする方法について紹介しましたが、リダイレクトは逆向きの「<」や「<<」も標準入力の代わりに利用できます。いちばんよく使われるのが、キーボード入力の代わりにファイルを流し込むという方法です。
下図は、grepコマンドにリダイレクトを使ってapplica.txtの中身を流し込み、その中から「bye」を含む行を抽出する例です。
終了文字について
先に「<」で標準入力にファイルの中身をリダイレクトする方法をお伝えしましたが、標準入力のキーボードから中身を入力することもできます。しかし、この場合、どこまでがコマンドに流し込む入力内容で、どこからがコマンド入力なのかをLinuxに区別させる必要があります。そこで、「<<」を使って標準入力の終了を告げる終端文字列を指定します。
多くの場合、この終端文字列にはEnd Of Fileの略である「EOF」が使われますが、なにを指定してもかまいません。例えば「end」を終端文字列として指定した場合は下図のように「end」を打ち込まれるまでは標準入力を取り込み、最終的にそれをリダイレクトして、applica.txtを作成します。
Linuxでのリダイレクトの種類
それでは、改めてLinuxでのリダイレクトについて整理してお伝えします。
リダイレクトの種類一覧
リダイレクトに使える入出力は、
- 標準入力
- 標準出力
- 標準エラー出力
の3つです。これらに0〜2のファイルデスクリプタの番号が振られていて、それを
- 「>」……ファイルへの上書き
- 「>>」……ファイルへの追記
- 「<」……ファイルからの入力
- 「<<」……標準入力の終端文字列の指定
といったリダイレクトを使ってファイルに入出力させます。
パターン別の使用例
この3つの入出力のうち、「<」のリダイレクトについては標準入力、「>」のリダイレクトについては標準出力がデフォルトで対応しています。つまり、
- 「<」は「0<」を
- 「>」は「1>」を
それぞれ意味しています。
標準入力
ファイルの中身を標準入力の代わりにするには、「<」のリダイレクトでコマンドにファイルの中身を流し込みます。正確にファイルデスクリプタ0番の標準入力に、ファイルの中身を流し込んでいます。「awk '102400<=$5' < list.txt」のように使用します。
標準出力
コマンドの出力結果をファイルにリダイレクトするには、「>」で流し込みます。「ls -l > list.txt」のように使用します。
標準エラー出力
コマンドの出力結果ではなく、エラー出力をファイルにリダイレクトするには、「2>」を使ってファイルに流し込みます。エラーコードが出力されたら、それをファイルに保存しておきたい場合などは「cat xxx.txt 2>> error.lst」のように使用します。
Linuxでのリダイレクトとパイプについて
初めのうち、リダイレクトと混乱しやすい存在にパイプがあります。「|」で表されるパイプは、複数のコマンドを1行でまとめたいときに利用されます。パイプは、
- コマンド1 | コマンド2 | コマンド3
のように用います。パイプで連結されたコマンドは、左から順に実行され、そのコマンドの標準出力が、パイプでつながった次のコマンドの標準入力に引き渡されるという形で処理されます。
リダイレクトとパイプの使い分けとは
リダイレクトとパイプとでは、データを引き渡す対象が異なります。
- リダイレクト……データをファイルに引き渡す
- パイプ……………データをコマンドに引き渡す
標準出力をパイプで渡す方法
それではパイプを使った簡単な使用例を紹介します。いま、1画面に収まりきらないapplica.txtを読みたいとします。1画面に収まるテキストであれば、「cat applica.txt」とすることで読むことができますが、この場合は以下のように文字があふれてしまって冒頭部分を読むことができません。
そこで、「cat applica.txt | more」とcatの標準出力をmoreコマンドの標準入力に流し込みます。すると1画面に収まるところで画面が止まり、下図のようにキー入力待ちになります。
あとはmoreコマンドに従って、つぎつぎに読み進めていくだけです。
このように、コマンドの標準出力をパイプ経由で次のコマンドの標準入力とすることで、次々に処理を重ねていけるのがLinuxのパイプの便利なところです。
Linuxでリダイレクトを活用しよう
以上、Linuxのリダイレクトについて簡単に紹介しました。「>」が標準出力をファイルにリダイレクトするには「>」を、追記したいときには「>>」を、エラー出力をリダイレクトしたいときには「2>」「2>>」を、そしてファイルの中身を標準入力にリダイレクトするときには「<」を使うということだけは、忘れないでください。
リダイレクトとパイプを使うことで、単機能のコマンドを組み合わせて複雑な作業をこなせるようになるのがLinuxの優れた点ですので、本記事の内容をうまく活かして、Linuxを使いこなせるようになってください。