next up previous contents
Next: 5 パイプとフィルタ Up: UNIX 基礎演習 B 組 Previous: 3 コマンド検索パス

Subsections


4 標準入出力とリダイレクト


4.1 復習 -- コマンド出力の保存

第 1 部入門第 4.2 節 の復習から始めます。

4.1.1 コマンド出力のファイルへの保存

コマンド command が画面に表示する内容を,ファイル名が file であるファイルに格納するには

command [argument] > file
とします。ここで [argument] は,command に引数を与えたけ れば argument に指定できることを表します。file として,まだ 存在しないファイルを指定すれば,file が自動的に作成されます。file が既存のファイルならば,その内容は command の出力で上書きさ れます14

ls -l .cshrc > cshrc_info

4.1.2 コマンド出力の既存ファイルへの追加

すでに存在するファイルにコマンド出力を追加したい場合には > の代わ りに >> を使い,

command [argument] >> file
とします。

4.1.3 練習

  1. date コマンドと cal コマンドを普通に実行して,画面の表示を確認し てください。

  2. >>> の使い方を確かめるために,以下を順に実行し てください。一行実行する度に cat コマンドでファイル now の内容を 確認してください。
     date > now
     cal > now
     date >> now
    

4.2 標準出力・標準エラー出力とリダイレクト

4.2.1 標準出力と標準エラー出力

ここでは,コマンドの実行結果が画面に表示される仕組みをより正確に説明します。

多くの UNIX コマンドは ``標準出力'' と ``標準エラー出力'' と呼ばれる情報 の出口を持っています。

  1. 標準出力 (stdout) : コマンドの実行結果が出力される
  2. 標準エラー出力 (stderr) : エラーメッセージ等のコマンド実行 に係わる付加的な情報が出力される
コマンドは,実行結果などを画面ではなく,これらの出口に出力します。 画面にコマンドの実行結果等が表示されるのは,図に示すように,通常は標準出力と 標準エラー出力が画面に接続されているためです。
\includegraphics[clip]{stdout.eps}

4.2.2 標準出力のリダイレクト

コマンドを実行する際,標準出力の接続先をファイルに変更するようシェルに対 して指示することができます。このような接続先の変更操作(切り替え)をリダイレクト(redirection) といいます。 第 4.1 節で紹介した >>> は,共に実 行するコマンドの標準出力の接続先のみをファイルに切り替えるリダイ レクトです。標準出力のリダイレクトを用いれば,通常は画面に表示されるコマ ンドの実行結果を,ファイルに保存することができます。

\includegraphics[clip]{redirect_stdout.eps}
例えば,
ls -l .cshrc > cshrc_info
を実行して結果がファイル cshrc_info に保存されるのは, 「> cshrc_info」の指定により ls コマンドの標準出力が,画面ではな くファイル cshrc_info に接続されるためです。

なお,tcsh や csh で標準出力と標準エラー出力の接続先を共にファイルに切り 替えるには >&>>& を使います。

4.2.2.1 注意

ls -l .cshrc > cshrc_info において, 「-l .cshrc」は ls コマンドに対して .cshrc の詳細情報を出力するよ うに指示するものなので,ls コマンドの引数です。 一方, 「> cshrc_info」は シェルに対して標準出力の接続先変更を指示しているのであり, ls コマンド自体の動作を変更するものではありません。 したがって, 「> cshrc_info」は ls コマンドの引数ではありません。

4.2.3 練習

ホームディレクトリで次の操作を行ってください。

  1. ls -l .cshrc を実行して,.cshrc の詳細情報が画面に表示され ることを確認してください。

  2. ls -l Cshrc を実行して,ファイル Cshrc が見つからない旨の エラーメッセージが出ることを確認してください。もし,ファイル Cshrc がホームディレクトリに存在するならば,名前を変更するか,不 要ならば削除してください。

  3. ls -l Cshrc .cshrc を実行してください。

    ファイル Cshrc が見つからない旨のエラーメッセージと, .cshrc の詳細情報が表示されます。

  4. ls -l Cshrc .cshrc > ls.out を実行して,画面の表示とファイ ル ls.out の中身を確認し,何が起きたかを前の図と対応させて考えて ください。

  5. ls -l Cshrc .cshrc >& ls.out を実行して,画面の表示とファイル ls.out の中身を確認し,前項と の違いを考えてください。 納得したら ls.out は削除しましょう。

4.3 標準入力とリダイレクト

4.3.1 標準入力

キーボードからデータを受け取って処理をする UNIX コマンドの多くは,正確に はキーボードではなく標準入力(stdin)という入口から入力を読み込みま す。標準入力は,シェルによって通常はキーボードに接続されているので,その 結果として,コマンドはキーボードから入力を受け取るのです。

\includegraphics[clip]{stdin.eps}
この図では,コマンドの標準エラー出力と標準出力の接続先(画面)を省略しています。 また,これ以降の図において,標準エラー出力の描画は略します。

4.3.1.1 練習

行数・単語数・文字数を数えるコマンド wc で,次の操作を試してみましょう。
  1. 引数を何もつけずに wc を実行してください。
    プロンプトが現れず,wc が標準入力からの入力を待っている状態になります。
  2. キーボードから複数の単語 (空白で区切りさえすれば,何と打ってもか まいません) を打ち込んで,CTRL-d (EOF; End Of File) を押し,wc への入力を正常に終了させてください。CTRL-cによる強制終了ではあ りません。
    wc はキーボードに接続されている標準入力から入力を受け取って処理 し,結果を標準出力に出しました。

    wc の実行が終了したのでプロンプトが現れます。

4.3.2 標準入力のリダイレクト

標準出力の接続先を切り換えできるのと同様に,標準入力の接続先を切り換える こと (リダイレクト) も可能です。

\includegraphics[clip]{redirect_stdin}
command が標準入力からの入力を受け付けるコマンドであるとき, キーボードの代わりにファイル file から入力を受け取るよう にするには
command [argument] < file
を実行します。ここで [argument] は,command に引数を与え たければ argument に指定できることを表します。

4.3.2.1 練習

  1. ホームディレクトリで wc < .cshrc を実行しましょう。これ は wc の標準入力を,キーボードからファイル .cshrc に切り換える例 です。

  2. 1. と同じく標準入力のリダイレクトを使って,ファイル .cshrc を wc に読み込ませて処理しましょう。ただし,今回は,wc にオプション引数 を指定することにより,単語数のみを求めてください。何というオプショ ンが必要かは man や jman コマンドで調べてください。

4.3.2.2 注意

wc は引数に既存のファイル名を指定して実行することもできます。その場合, wc は標準入力ではなく,指定したファイルを直接読み込んで処理します。例え ば wc .cshrc を実行しても,wc はファイル .cshrc を読み込みます が,これは標準入力からの読み込みではありません。コマンドの読み込み元が標 準入力か否かの区別を理解することは,後でパイプを利用する際に大切になりま す。

4.3.3 標準入出力の同時リダイレクト

コマンドの標準入力と標準出力を同時に切り換えることもできます。 例えば,標準入力を .cshrc に,標準出力を wc.out に切り換えて wc コマンドを実 行するためには

wc < .cshrc > wc.out
とします。 実際に試して結果を確認してください。 納得したら wc.out を削除しましょう。


4.4 問題

  1. [準備] ホームディレクトリに unix というディレクトリが 存在することを確認してください。無ければ作成してください。次に,ディレク トリ unix に part4 という名前の新しいディレクトリを作ってください。

    以降の問題では,今作成したディレクトリ part4 (~/unix/part4) にファイルを作ってください。そのために,part4 をカレントディレクトリと しましょう。

  2. echo コマンドは引数に与えた文字列を標準出力に出力するコマンドです。

    echo とリダイレクトを使って,自分の学生番号と名前の入ったファイル myname を作ってください。

  3. cat コマンドは,引数にファイル名が与えられると,そのファイルを読 み込んで,内容を標準出力に出力します。一方,引数にファイル名が与 えられなければ,標準入力から読み込みこんだものを,そのまま標準出 力に出力します。このことに注意して,まず次の操作を行ってください。
    1. 引数を何も与えずに cat コマンドを実行してください。 cat コマンドが標準入力つまりキーボードからの入力を待ってい る状態になります。

    2. ここで,キーボードから hakodate と打ち込んで <ENTER> を押 しましょう。すると,今打ち込んだ hakodate の次の行に,もう 一行 hakodate が表示されます。これは cat コマンドが標準出 力を通じて画面に出力したものです。

    3. さらにキーボードから sapporo と打ち込んで <ENTER> を押し, 結果を観察してください。

    4. cat コマンドへの入力を CTRL-d で終了させてください。 cat の実行が正常に終了してプロンプトが現れます。

    さて,cat コマンドを用いて,中身が

    hakodate
    sapporo
    asahikawa
    kushiro
    であるファイルを作成してください。ファイル名は campus とします。

  4. echo コマンドを使ってファイル campus に次の 2 行を追加してくださ い。 echo コマンドは複数回実行して構いません。
    iwamizawa
    hakodate

  5. sort コマンドは,その名前が示す通り,入力をソート(並べ替え) して 標準出力に出力するコマンドです。sort file... の形式で実行 すると,sort は file... の内容を直接読み込みますが, file... を略すと標準入力から読み込みます。

    1. まず,sort campus を試してください。

      これは,sort がファイル campus を直接読み込んで処理する例 です。

    2. 引数無しで sort コマンドを実行し,標準入力(キーボード)か ら
      hakodate
      sapporo
      asahikawa
      と入力してください。sort コマンドを正常に終了させて,出力 を観察してください。

    3. sort コマンドと標準入力のリダイレクトを使って,ファイル campus の内容を並べ替えて画面に表示しましょう。

    4. 標準入力と標準出力のリダイレクトを同時に使って,ファイル campus の中身を並べ替えたものを,ファイル campus_s に保存 しましょう。

  6. uniq コマンドは,連続した重複行から重複を取り除くためのコマンドで す。uniq file の形式で実行すると,uniq は file の内容 を直接読み込みますが,file を略すと標準入力から読み込みます。

    uniq コマンドの標準入力からファイル campus_s の内容を与え,uniq の動作を確認してください。次にファイル campus を与えた場合との違 いを確認してください。

  7. tr は文字の置換を行うコマンドです。 tr は標準入力から入力を読み込み,引数での指定に従って文字を 置換し,結果を標準出力に出力します。

    1. tr コマンドの動作を確認するために,tr a A を実行してから
      hakodate
      sapporo
      
      を標準入力(キーボード)から入力してください。入力を終えた ら tr コマンドを正常終了させてください。

    2. tr では文字集合の置換もできます。tr a-z A-Z を実行 してみましょう。入力には前項と同じものを与えてください。

    では,ファイル campus の内容をすべて大文字にしたものを,ファイル CAMPUS に保存しましょう。tr コマンド,および標準入力と標準出力の リダイレクトを使ってください。


next up previous contents
Next: 5 パイプとフィルタ Up: UNIX 基礎演習 B 組 Previous: 3 コマンド検索パス

平成18年1月25日