「Linux標準教科書」の第4章は「正規表現とパイプ」です。
今回は、”その1”として、以下の部分について勉強しました。
- 標準入出力
- リダイレクト
- パイプ
これらを私なりにまとめて紹介します。
「Linux標準教科書」を読んで分からなかったところは別で調べ、自分で分かるように付け足したりしてまとめましたので、「Linux標準教科書」の勉強の補助としてこの記事を利用していただけると幸いです。
標準入出力
Linuxのそれぞれのコマンドはプログラムで、「1つの入り口と2つの出口」があります。
1つの入り口は「標準入力」といい、
2つの出口は「標準出力」と「標準エラー出力」といいます。
「標準入力」は、一般的にはキーボードになります。
コマンドを入力するのにキーボードを使いますので、分かりやすいですね。
「標準出力」は「特に指定がない場合のデータの出力先」のことで、
「標準エラー出力」は「特に指定がない場合のエラーメッセージの出力先」のことで、
両方とも出力先はディスプレイです。
たとえば、catコマンドでファイルの中身を表示したときに表示されたファイルの中身が「標準出力」。
catコマンドでファイル名を打ち間違えると「そのようなファイルやディレクトリはありません」と表示されますが、これが「標準エラー出力」です。
両方とも出力先がディスプレイなので、私達には一緒に見えますが、Linuxでは「標準出力」と「標準エラー出力」を区別しているということです。
リダイレクト
先ほど説明した通り、「標準出力」と「標準エラー出力」はディスプレイに出力されますが、この出力先をディスプレイとは別のところに出力するのが「リダイレクト」です。
どんなときにリダイレクトが必要かというと、「ディレクトリの中身の一覧を記録したい」ときや、「エラーメッセージを記録したい」ときなどです。
リダイレクトの基本的な書式
リダイレクトの書式は、「標準出力」と「標準エラー出力」では以下の通り違います。
「標準出力」をファイルにリダイレクト(ディスプレイ以外の出力先に)
$ コマンド > 出力先ファイル名
「標準エラー出力」をファイルにリダイレクト(ディスプレイ以外の出力先に)
$ コマンド 2> 出力先ファイル名
「標準エラー出力」をリダイレクトするときには>の左側に2がつきます。
これは、「ファイルディスクリプター番号」といって、プログラムがアクセスするファイルや標準入出力などをOSが識別するために用いる識別子のことで、「標準出力」には1が、「標準エラー出力」には2が割り当てられています。
しかし、「標準出力」のリダイレクトには番号が無く、ただの>が使われます。
試しに、1>としてリダイレクトしたところ、番号無しの>と同じ結果がファイルに出力されました。
「標準出力」のリダイレクトのときは、「ファイルディスクリプター番号」は省略しても良いことになっています。
標準出力のリダイレクトの上書きと追記
「標準出力」の場合、出力しようとするファイル名のファイルが存在しないと新規作成になりますが、存在していた場合は上書きされて、元の内容が消えてしまいます。
上書きではなく、元のデータに追加で書き足したい(追記)ときは、>>を使います。
先ほど作成したlsoutputに>>を使ってもう一度lsコマンドの標準出力を追記させて、catコマンドで確認したのが以下の画像です。
同じ内容が追記されました。
catコマンドによるファイル作成
catコマンドとリダイレクトを利用すると、自由に内容を書き込んでファイルを新規作成することができます。
ファイルを新規作成(内容を書き込んだ後に)
$ cat > ファイル名
今回はcat-outputというファイルを作成してみます。
コマンドを入力してEnterを押すと、ターミナルでは次の行にカーソルが移るだけで、$マークが表示されません。
ここから内容を入力していきます。
とりあえず、redirect successと入力し、Enter。
Cntl+Dキーで入力を完了すると、次の行に$マークが表示されます。
作成されたcat-outputファイルをcatコマンドで確認すると、ちゃんとredirect successと表示されました。
2>&1(標準出力と標準エラー出力を同じファイルにリダイレクト)
先ほど説明しましたが、「標準出力」には1、「標準エラー出力」には2という「ファイルディスクリフター番号」が割り当てられています。
これにより、普通にリダイレクトしても「標準出力」と「標準エラー出力」は別々のファイルにしか書き込むことができません。
これを「標準出力」にまとめて1つのファイルに書き込むために2>&1を使います。
書式は以下の通り。
$ コマンド > 出力先のファイル名 2>&1
この書式で実行すると、指定した出力先のファイルに「標準出力」も「標準エラー出力」も一緒に書き込まれます。
いったい何に使うの?
調べたところ、プログラムが正常に動作しているか確認するためのログ(記録)を保存するために使うそうです。
正常に動作しているかどうかを2つのファイルで見比べるよりも、1つのファイルで見た方が便利ですからね。
納得です。
ちなみに、同じファイルに「標準出力」と「標準エラー出力」を続けて追記するには、以下の書式を使います。
$ コマンド >> 出力先のファイル名 2>&1
パイプ(パイプライン)
複数のコマンドを連続で実行するのに「パイプ」というものを使います。
正式には「パイプライン」といい、「パイプ」を使った処理を「パイプライン処理」というそうです。
この「パイプ」、ただ単に複数のコマンドを連続で実行させるだけではなく、「コマンドの標準出力を次のコマンドの標準入力に繋げる」ことができます。
書式は以下の通り
$ コマンド | 次のコマンド
試しに、勉強用に作成したLSTTというディレクトリでターミナルを起動してlsコマンドを実行します。
LSTTディレクトリの中身が表示されました。
これを、パイプを使ってlessコマンドに標準出力の内容を渡してみます。
$ ls | less
lessのページャーでlsの標準出力と同じ内容が表示されました。
qキーを押してページャーを終了させます。
まとめ
今回は、「Linux標準教科書」の第4章「正規表現とパイプ」の内、”その1”として、以下の部分について勉強して、自分なりにまとめて紹介しました。
- 標準入出力
- リダイレクト
- パイプ
「Linux標準教科書」を読んで分からなかったところは別で調べて、自分で分かるように付け足したりしてまとめましたので、「Linux標準教科書」の勉強の補助として私の記事を利用していただけると幸いです。