こんにちは。関東の大学に通う大学生ミンチ(@programminchi)です。今回はUNIXのリダイレクトとパイプについて学んでいきましょう。
リダイレクトを理解する上での前提知識
標準入力
標準入力とは、プログラムのデータの入力元のことです。通常UNIX系では何も指定がなければ、標準入力はキーボードに割り当てられます。
標準出力
標準出力とは、プログラムが結果を出力する場所のことです。通常UNIX系では何も指定がなければ、標準出力は画面に割り当てられます。
標準エラー出力
標準エラー出力とは、プログラムがエラーメッセージを出力する場所のことです。何も指定がなければ、標準エラー出力は画面に割り当てられます。
この標準エラー出力と標準出力の違いがイメージし辛いと思うので以下に1つ例を挙げます。
$gcc file.c
gccコマンドは後々説明していきますが、C言語のファイルをコンパイルするコマンドだと覚えておいてください。
そして上の例ではC言語のファイルであるfile.cをコンパイルしています。
ここで、file.cの内容に間違いがなければ普通に標準出力として出力されますが、file.cの内容に間違いがあると、標準エラー出力として出力されます。
リダイレクトについて理解しよう
標準入力、標準出力、標準エラー出力はデフォルトの状態から切り替えることができます。以下ではその方法を1つずつ説明していきます。
標準出力をリダイレクトしよう
ではまず、標準出力をリダイレクトしてみましょう。以下に例を挙げていきます。
$ls > file
lsコマンドでは、結果は通常画面に出力されますが、上のように>を使ってリダイレクトすることで、代わりに標準出力をファイルに保存することができます。
新しいファイルに出力するのではなく、存在するファイルに出力を追加したいときは、上の>を>>にしてあげます。
標準エラー出力をリダイレクトしよう
次に標準エラー出力のリダイレクトについて見ていきましょう。以下の例を見てください。
gcc file.c 2> file
gccコマンドでは、標準エラー出力は、通常画面に出力されますが、上のように2>を使ってリダイレクトすることで、代わりに標準エラー出力をファイルに保存することができます。
標準入力をリダイレクトしよう
最後に標準入力のリダイレクトについて見ていきましょう。以下の例を見てください。
$wc -l < file
wcは後から説明しますが、単語の数などを数えてくれるコマンドです。lオプションをつけると、行数のみをカウントしてくれます。つまり上の例では、ファイルを標準入力としファイル内の行数が出力として画面に表示されます。
その他の処理について
上で説明してきたようなリダイレクトの処理を組み合わせることもできます。以下を見てください。
$command &> file
この例では標準出力と標準エラー出力をまとめてfileに保存してくれます。
また、以下のようにすることも可能です。
$command < file1 > file2
ここではfile1から標準入力を受け入れ、file2に標準出力として保存しています。
このようにリダイレクトは組み合わせていくことが可能ということも覚えておいてください。
パイプについて理解しよう
あるコマンドの標準出力を別のコマンドの標準入力にする仕組みをパイプといいます。
パイプを使うことで複雑な処理を一気に行うことができます。パイプは|(縦棒)で表すことができます。以下に1つ例を示します。
$ls | wc -l
感覚的に分かると思いますが、lsコマンドで得られる出力をwc -lコマンドに入力として与えて、行数を出力させます。
これはごくごく簡単な例ですが、何個もパイプをつなぎ合わせることで複雑な処理を効率よく行うことができます。
まとめ
今回はリダイレクトとパイプについて学んでいきました。パイプについては、まだ実感できない人も多いかもしれませんが、実戦で結構役に立ちます。
次の回では、パイプを応用的に使っていきます。パイプを使用する際によく出てくるコマンドについても詳しく説明しているので是非見てください。
今後も定期的にコンピュータ系の記事を発信していくので是非、興味のある人はツイッターの方もフォローお願いします!!