コンピュータは,一言でいってしまえば,データを与えるとそれを処理し結果を吐き出すという出入口を備えた機械である.
Unixにはファイルディスクリプタ(ファイルハンドラともいう)というものがあり,プロセスとそれが利用するファイルとを結び付けている. 何らかのプログラムがファイルを作成してそこに書き込みを行うときには,プロセスはファイルディスクリプタを使ってそのファイルへのアクセス方法を知ることができる.
UNIXのファイルディスクリプタのうちの3つは予約され,プロセスが起動されると必ずこの3つのファイルディスクリプタ(そして,対応するファイルが)が利用可能になる. 予約されている3つのファイルディスクリプタとは標準入力(Standard Input),標準出力(Standard Output),そして標準エラー(Standard Error)(Bシェルではそれぞれディスクリプタの0番,1番,2番)である.
これら標準入出力・エラーに関するファイルに結びついた装置(デバイス:device)は以下のように対応づけされている.
装置 | 装置名称 |
標準入力 | キーボード |
---|---|
標準出力 | ディスプレイ |
標準エラー | ディスプレイ |
シェルスクリプト(プログラム)ではBシェルを前提に書くのが普通である. しかし,「普段」の作業では自分が使っているシェル(今の場合はCシェル系)にあわせた作業をする必要がある!
これは確かに面倒なことであるが,BシェルはどんなUnixでも必ず装備しているシェルである. 一方,自分の使うシェルは好みでいろいろ選べるからである.
% ls Mail News public_html mytext.txt sample.tex tmp %
% echo abcdefg abcdefg % echo "Hello, world." Hello, world. %
% cat↓ I am a student.↓ You are too.↓ C-d I am a student. You are too. %
% cat myfile .... .... %
% lss command lss not found %
リダイレクションというのは,「普通の」入力元や出力先を変更する機能である. このリダイレクション機能を使うと,ファイルから(コマンドに)データを入力したり,処理結果をファイルに書く出したりすることができる.
入出力のリダイレクション(redirection)には
< または >を使ってリダイレクションの方向を指定する.
UNIXではリダイレクションと後で説明するパイプを組み合わせて目的とする処理を行なう. このようにして,コマンドを組み合わせてきわめて効率のよい情報処理操作を行うことができるのはUnixの大きな利点である.
commnad > fileout | コマンドcommandの出力先をファイルfileoutにリダイレクションする |
commnad < filein | コマンドcommnadへの入力をファイルfileinからリダイレクションする |
リダイレクションの例を次に示す:
% echo abcdefg abcdefg % echo abcdefg > xyz % cat xyz abcdefg
% ls > file % cat file
まず,xyz をzooにコピーしておく. echoを使って同じファイル名 xyz に別の出力を書きこんでみる
このように既にファイルがある場合に,記号 > でリダイレクトしてファイルに結果を書き込もうとしても書き込みできない.% cp xyz zoo % echo "This is your World." > xyz xyzと言うファイルはすでに存在します. %
ファイルが既に存在しても書き込みたい場合には、記号 > の代わりに >! を使う。
なお,Bシェル系の場合は,既にファイルが存在していても,前の内容が消えて書き込みされてしまう.% echo "This is your World." >! xyz % cat xyz This is your World. %
% cat xyz This is your World. % cat zoo >> xyz % cat xyz This is your World. abcdefg %
% echo hijklmn > stu % cat stu hijklmn % cat xyz stu This is your World. abcdefg hijklmn % cat stu xyz hijklmn This is your World. abcdefg %
% cat xyz stu > pqr
これをファイル errorに書き出すには,Bシェルではディスクリプタ2番へという意味で記号『 2> 』を使う.% cat abc cat: abc: No such file or directory %
また,本学のデフォルト環境(tcsh)のCシェル系では% cat abc 2> error % cat error cat: abc : No such file or directory %
% cat abc >& error % cat error cat: abc : No such file or directory %
cat stu abc hijklmn cat: abc: No such file or directory %
% cat stu abc > myfile cat: abc: No such file or directory % cat myfile hijklmn %
また,本学のデフォルト環境(tcsh)のCシェル系では () で括って,標準出力と標準エラーを別々に扱うようにする.% cat stu abc 2> error hijklmn % cat error cat: abc: No such file or directory %
% (cat stu abc > save) >& error % cat save hijklmn % cat error cat: abc: No such file or directory %
また,本学のデフォルト環境(tcsh)のCシェル系では単に次のようにするだけである.% cat stu abc > myfile 2>&1 % cat myfile hijklmn cat: abc: No such file or directory %
% cat stu abc >& myfile % cat myfile hijklmn cat: abc: No such file or directory %