オンラインテキスト目次
コンピュータリテラシー目次

UNIXの標準入出力とリダイレクション

標準入出力

コンピュータは,一言でいってしまえば,データを与えるとそれを処理し結果を吐き出すという出入口を備えた機械である.

Unixにはファイルディスクリプタ(ファイルハンドラともいう)というものがあり,プロセスとそれが利用するファイルとを結び付けている. 何らかのプログラムがファイルを作成してそこに書き込みを行うときには,プロセスはファイルディスクリプタを使ってそのファイルへのアクセス方法を知ることができる.

UNIXのファイルディスクリプタのうちの3つは予約され,プロセスが起動されると必ずこの3つのファイルディスクリプタ(そして,対応するファイルが)が利用可能になる. 予約されている3つのファイルディスクリプタとは標準入力(Standard Input),標準出力(Standard Output),そして標準エラー(Standard Error)(Bシェルではそれぞれディスクリプタの0番,1番,2番)である.

これら標準入出力・エラーに関するファイルに結びついた装置(デバイス:device)は以下のように対応づけされている.

UNIXの標準入出力装置
装置 装置名称
標準入力 キーボード
標準出力ディスプレイ
標準エラーディスプレイ

演習

次の例を考えてみよ. Bシェルと本学のデフォルトシェルCシェル系(tcsh)とは扱い方が異なることに注意する.
シェルスクリプト(プログラム)ではBシェルを前提に書くのが普通である. しかし,「普段」の作業では自分が使っているシェル(今の場合はCシェル系)にあわせた作業をする必要がある!
これは確かに面倒なことであるが,BシェルはどんなUnixでも必ず装備しているシェルである. 一方,自分の使うシェルは好みでいろいろ選べるからである.

リダイレクション

UNIXのシェルはコマンドの入力や出力を切り替えるリダイレクション機能を持っている. UNIXでは,入力は「普通は」キーボードから入力され,出力は「普通は」モニターに書かれる.

リダイレクションというのは,「普通の」入力元や出力先を変更する機能である. このリダイレクション機能を使うと,ファイルから(コマンドに)データを入力したり,処理結果をファイルに書く出したりすることができる.

入出力のリダイレクション(redirection)には

< または >
を使ってリダイレクションの方向を指定する.

UNIXではリダイレクションと後で説明するパイプを組み合わせて目的とする処理を行なう. このようにして,コマンドを組み合わせてきわめて効率のよい情報処理操作を行うことができるのはUnixの大きな利点である.

演習

リダイレクションの基本パターンは次の通り.

commnad > fileout コマンドcommandの出力先をファイルfileoutにリダイレクションする
commnad < filein コマンドcommnadへの入力をファイルfileinからリダイレクションする

リダイレクションの例を次に示す:

  1. コマンドecho の出力先をファイルにする.
    % echo abcdefg
    abcdefg
    % echo abcdefg > xyz
    % cat xyz
    abcdefg
    
  2. コマンドls(現在のワーキングディレクトリ内のファイルおよびディレクトリの一覧結果を標準出力装置へ出力する)の結果を,指定したファイル file へリダイレクトするには,次のようにする.
    % ls > file
    % cat file
    
  3. 本学標準のtcsh(Cシェル系)の場合:

    まず,xyz をzooにコピーしておく. echoを使って同じファイル名 xyz に別の出力を書きこんでみる

    % cp xyz zoo
    % echo "This is your World." > xyz
    xyzと言うファイルはすでに存在します.
    %
    
    このように既にファイルがある場合に,記号 > でリダイレクトしてファイルに結果を書き込もうとしても書き込みできない.

    ファイルが既に存在しても書き込みたい場合には、記号 > の代わりに >! を使う。

    % echo "This is your World." >! xyz
    % cat xyz
    This is your World.
    %
    
    なお,Bシェル系の場合は,既にファイルが存在していても,前の内容が消えて書き込みされてしまう.
  4. 前のファイルの内容をクリアせずに中身を追記したい場合には,記号 >>を使う.
    % cat xyz
    This is your World.
    % cat zoo >> xyz
    % cat xyz
    This is your World.
    abcdefg
    %
    
  5. catに2つ以上のファイルを「空白で区切って」渡すと,その内容を一まとめにしして(連接して)返す.
    % echo hijklmn > stu
    % cat stu
    hijklmn
    % cat xyz stu
    This is your World.
    abcdefg
    hijklmn
    % cat stu xyz
    hijklmn
    This is your World.
    abcdefg
    %
    
  6. したがって,指定したファイルを連接して1つのファイルとして書き出すことが簡単にできる(Windowsで同様のことを行う手間を考えてみよ)
    % cat xyz stu > pqr
    
  7. 標準エラー出力は普通はモニタに表示される. ファイルabcが存在しないとする.
    % cat abc
    cat: abc: No such file or directory
    %
    
    これをファイル errorに書き出すには,Bシェルではディスクリプタ2番へという意味で記号『 2> 』を使う.
    % cat abc 2> error
    % cat error
    cat: abc : No such file or directory
    %
    
    また,本学のデフォルト環境(tcsh)のCシェル系では
    % cat abc >& error
    % cat error
    cat: abc : No such file or directory
    %
    
  8. 通常は,標準出力と標準エラーが交じり合っている.
    cat stu abc
    hijklmn
    cat: abc: No such file or directory
    %
    
  9. したがって,次の結果に注意する. 標準出力と標準入力とは別々に扱われているのが分かる.
    % cat stu abc > myfile
    cat: abc: No such file or directory
    % cat myfile
    hijklmn
    %
    
  10. この標準エラーをファイル error に書くようにすると,Bシェル系では
    % cat stu abc 2> error
    hijklmn
    % cat error
    cat: abc: No such file or directory
    %
    
    また,本学のデフォルト環境(tcsh)のCシェル系では () で括って,標準出力と標準エラーを別々に扱うようにする.
    % (cat stu abc > save) >& error
    % cat save
    hijklmn
    % cat error
    cat: abc: No such file or directory
    %
    
  11. 標準出力もエラーもまとめて1つのファイルに書き出したいときには,Bシェルでは記号『 2>&1 』を使う. ファイルディクリプタ2番と1番をまとめるという意味.
    % cat stu abc > myfile 2>&1
    % cat myfile
    hijklmn
    cat: abc: No such file or directory
    %
    
    また,本学のデフォルト環境(tcsh)のCシェル系では単に次のようにするだけである.
    % cat stu abc >& myfile
    % cat myfile
    hijklmn
    cat: abc: No such file or directory
    %
    

コンピュータリテラシー目次
オンラインテキスト目次

mizutani@rsch.tuis.ac.jp
ohmi@rsch.tuis.ac.jp (加筆修正:2002年5月27日)