Subsections

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

2.3.1 キーボードからの入力と入力の終わり -- CTRL-d

次の操作を試してみましょう。
  1. wc year を実行し,wc がどんなコマンドだったかを思い出してください5
  2. 次に,引数を与えないで wc を実行してみましょう。
    何も起きないどころかプロンプトも表示されません。
  3. ここで,キーボードから ls と打って,<ENTER> を押しましょう。
    プロンプトが表示されないままでコマンドを打っても,そのコマンドは 実行されません。
  4. キーボードから I like you. と打ち込んで <ENTER> を押しましょ う。
    まだ何も起こりませんね。
  5. 今度は Ctrl キーを押しながら d キーを押してください。これからは CTRL キーを押しながら d キーを押すことを CTRL-d と表記します。
    wc の実行結果が出力され,プロンプトが現れました。wc は実行を終 えました。

ファイル名を指定せずに wc を実行すると,wc はキーボードからの入力を処理 します6。2. においてプロンプトが表示されなかったのは, wc が実行中であり,キーボードからの入力を待っている状態だったからです。

4. で使った CTRL-d は「入力の終わり (正確には,ファイルの終り; EOF = End Of File)」を意味するキーです。 wc は CTRL-d が入力されたのでキーボードからの読み込みを終了し, 実行結果を画面に出力しました7

なお,上の操作ではキーボードから 2 行 4 単語を入力しましたから,行数と単 語数に関しては wc は正しい結果を出力しています。一方,文字数については, 画面に表示されている入力文字数(空白文字を含む)より 2 文字分多いはずです。 これは,行末に入力した <ENTER> を,wc が文字として数えているからです。 実際,<ENTER> で入力したものは特殊な文字であって,通常の文字として表示 される代りに,画面上では改行として表示されているのです。

注意:コマンドの強制終了 -- CTRL-c

CTRL-c はコマンドの実行を強制的に終了させる働きをします。 上記の例で CTRL-d の代わりに CTRL-c を押すと, wc は読み込みを完了する前に終わってしまいます。 したがって文字数等の出力は行われません。 両者の違いに注意しましょう。

コマンドを実行したけれど動作がおかしい,とか, プロンプトが戻るまでの時間が長すぎる, といった場合には CTRL-c によるコマンドの終了を試してみるといいでしょう。 コマンド行でタイプミスをしてしまい,最初から打ち直したい場合にも, CTRL-c が使えます。 ただし,コマンドを正常終了できる場面では,正規の終了操作をすべきです。

2.3.2 標準入力

wc コマンドのように,キーボードからデータを受け取って処理できる UNIX コマンドでは,多くの場合, 正確には 標準入力 stdin (standard input) という入口から入力を読み込みます。 標準入力は,通常はキーボードに接続されているので, その結果として,コマンドはキーボードから入力を受け取るのです。
\includegraphics*{stdin.eps}
この図では,コマンドの標準エラー出力と標準出力の接続先(画面)を省略しています。 また,これ以降の図において,標準エラー出力の描画は略します。

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

標準出力の接続先を切り換えできるのと同様に,標準入力の接続先を切り換える こと (リダイレクト) も可能です。
\includegraphics*{redirect_stdin}
command が標準入力からの入力を受け付けるコマンドであるとき, キーボードの代わりにファイル file から入力を受け取るよう にするには
command [argument] < file
を実行します。ここで [argument] は,command に引数を与え たければ argument に指定できることを表します。

2.3.3.1 練習

  1. wc < year を実行しましょう。 これは wc の標準入力の接続先を,キーボードからファイル year に切り換える例です。

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

注意

wc の引数に既存のファイル名を指定して, wc year のように実行した場合, wc は引数のファイル year を直接読み込んで処理します。 標準入力のリダイレクトである wc < year と出力は同じですが, wc 内部での動作は異なります。

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

コマンドの標準入力と標準出力を同時に切り換えることもできます。 例えば,標準入力を year に,標準出力を wc.out に切り換えて wc コマンドを実 行するためには
wc < year > wc.out
とします。 これを試したら,不要な wc.out は削除しましょう。