標準入出力・リダイレクション・パイプ
LinuxOSの補足
- ファイルとは
- 標準入出力
- リダイレクション
- パイプ
ファイルとディレクトリ
ファイルとディレクトリ、よく耳にしますが単語の意味を整理します。
ファイルとは、「コンピューター上で記録・管理される情報の単位」を指します。ファイルには人間が区別がつきやすいようにそれぞれ名称が付けられており、ファイル名と言います。命名規則がありますが、ここでは割愛します。
ディレクトリは、ファイルをその種類や目的に応じて整理するための仕組みのことです。ディレクトリは、ファイルだけではなく、ディレクトリ自体も格納できます。
UNIX/Linuxを利用するユーザーの存在(ユーザーID)自体もディレクトリとして整理されており、これを「ホームディレクトリ」や「ログインディレクトリ」と呼びます。UNIX/Linuxの全てのファイルはディレクトリで整理されており、「/」(ルートディレクトリ)を頂点とするツリー構造になっています。UNIX/Linuxではディレクトリもファイルの1種として扱われます。
ファイルの分類
ファイルは、複数の基準によって以下のように分類できます。
プログラムとデータ
- データファイル(JPEG、PNG等の画像ファイル、サウンドファイル、文書ファイルなど、プログラムによって書かれたり、読まれたりする)
- プログラムファイル(C言語やJavaによって書かれたプログラム、そのままでは実行できない)
テキストとバイナリ
- テキストファイル(中身を見てそのまま読むことが可能)
- バイナリファイル(バイナリデータを保存したファイルであり、テキストではないため人間は読めない)
ファイルフォーマットについて
ファイルはその中身が意味する内容や目的によって情報の記録の仕方が変わり、これを「ファイルフォーマット」と呼びます。ファイル名末尾のピリオド後につける拡張子などによって区別することがあります。ただ、UNIX/Linuxには拡張子が存在しないファイルも多々存在します。
ファイルのアクセス権(パーミッション)について
UNIX / Linux のシステムではファイルのアクセス権を以下の3種類に分類しています。
- 「読める (Read)」 r
- 「書き込める (Write)」 w
- 「実行できる (eXecute)」 x
これは、UNIX / Linux のファイル(ディレクトリ含む)すべてに付け加えられた情報であり、「アクセス権」(パーミッション)と呼ばれます。
また、アクセス権の付与する対象者についても、「所有者」「所有グループ」「その他」 の3者に区別しています。普通は、ls コマンドを使って、ls -l を実行すれば、これら3者に対する各3つの権限(r,w,x)が表示されます。
標準入出力とリダイレクションについて
UNIX/Linuxで、デフォルトで設定されている入力元を標準入力(stdin)、出力先を標準出力(stdout)と呼びます。
- 標準入力(stdin)・・・キーボード
- 標準出力(stdout)・・・ディスプレイの中のコンソールやウインドウ
例えば、lsコマンドを引数なしで実行した場合。
イメージは湧きますね。キーボードで「入力」して、lsコマンドを実行して、結果(のファイルの一覧)がコンソール上に「出力」される。
$ls
file1 file2
この標準入力や標準出力を切り替えるのを「リダイレクション」と言います。具体例を一つ。
$ls > data #dataファイルに標準出力を切り替えている、つまりファイル一覧をコンソールではなくdata「ファイルへ出力」したということ。
標準出力の切替先がファイルになっているため、catコマンドでdataファイルの中身を見るとファイル一覧が表示されます。この場合、dataファイルの中身が記述されていた場合は、上書きされます。単純に追加したい場合は、>>を使用すると追記できます。
では、入力の切り替えってどんな感じでしょう。
$cat < aaa #これって標準入力を「ファイルから」に切り替えています。
上記の例は、$cat aaa
と同じ意味です。わかりにくいかもしれないので、ファイルから入力するように切り替えた事例をもう1例。
標準入力から2つの数字を読み込んで、その数字の乗算の結果を出力するコマンドa.outが あるとします。
$a.out 3 2 #キーボードから入力 6 #a.outの出力した答え $cat data #同じ数値が書いてあるdataファイルを用意する 3 2 $a.out < data #ファイルから入力 6 #無事出力されました!
出力のうちでも、エラーメッセージは、標準出力とは別の標準エラー出力に出力されます。どちらの出力も画面になっているので見分けがつかないのですが、実は別なのです。
OSには入出力の識別子がついていて、Linuxではデフォルトで
- 標準入力には0
- 標準出力には1
- 標準エラー出力には2
という番号が振られています(ファイルディスクリプタといいます)。このように別々に区別をしていることからも、標準出力と標準エラー出力は出力先が分かれています。
そして、標準出力と同様、出力先をファイルへ切り替えること可能です。
$ls aaa 2> abc.txt $cat abc.txt
2は標準エラー出力の2ですね。また、標準出力もエラー出力も同じファイルに出力したい場合には、「2&>1」という記号を用います。
ls > /dev/null 2&>1 #&>を使用すると、「2(標準エラー出力)を1(標準出力)にマージする」という意味になるようです。
上記の場合、エラーメッセージも同じデバイスファイル(ゴミ箱)に出力されるので、結果何も表示されないです。
デバイスファイルについて
UNIXでは周辺装置(ディスク装置、モニタ画面、プリンタなど)も仮想的なファイルとして扱えるようになっています。この仮想ファイルをデバイスファイ ルと呼 んでいます。なんでもファイルなんですね。
そして、デバイスファイルは、実はリダイレクションの入出力先として、ファイルと同じように利用することができます。
cat ddd 2> /dev/null #/dev/null(ヌルファイル)は何も出力しない仮想ファイルです。ゴミ箱として使えますよね。
以下に、リダイレクションの種類をまとめました!
種類 | 意味 |
---|---|
コマンド > ファイル | コマンド結果をファイルへ書き込む |
コマンド < ファイル | ファイルの中身をコマンドの標準入力へ |
コマンド >> ファイル | コマンドの出力結果をファイルへ追記 |
コマンド 2> ファイル | エラー出力をファイルへ書き込む |
コマンド 2>> ファイル | ファイルにエラー出力を追記 |
コマンド > ファイル 2>&1 | ファイルに標準出力と標準エラー出力を書き込む |
コマンド >> ファイル 2>&1 | ファイルに標準出力と標準エラー出力を追記 |
コマンド << 終了文字 | 終了文字が現れるまで標準入力へ送る | コマンド > /dev/null 2>&1 | 表示をしない。(表示をゴミ箱へ) |
パイプについて
「|」(パイプ)と呼ばれる記号を 使用して、コマンドの出力結果を、直接他のコマンドの入力にすることができます。連結ですね!
$ls | sort #lsの実行結果(ファイル一覧を)をsortコマンドの入力にする
上記の場合、lsの結果がsortに渡され、リスト一覧がアルファベット順に表示されます。パイプはいくらでも連結ができます。
最後に
以上となります!