情報処理第 6 回標準入出力，パイプ，リダイレクト

2000 年 5 月 24 日

目次

1 本日の目標 1

2 mule のちょっと良い使い方 1

3 本題 1 3.1 ファイルを作って一括入力する（入力リダイレクト） . . . . . . . . . . . . . . . . . . . . . 2 3.2 実行結果をファイルに出力する（出力リダイレクト） . . . . . . . . . . . . . . . . . . . . . 2 3.3 パイプ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3.4 標準エラー出力のリダイレクト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3.5 リダイレクトの組合せ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3.6 その他のリダイレクトとパイプ（余裕のある人は調べて） . . . . . . . . . . . . . . . . . . 4

4 カット＆ペースト, コピー＆ペースト 5 4.1 カット＆ペースト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 4.2 コピー＆ペースト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1 本日の目標

• 標準入力, 標準出力, リダイレクト, パイプを知る.

2 mule のちょっと良い使い方

mule を起動するときに，引数やオプションを指定することにより，その後の作業を少し省略出来ます．例えば， mule の起動後，直ちに file1 を読み込みたいときは，

     mule file1

とするとします．これは， mule を起動してから， C-x C-f を打って， file1 を読み込むのと同じです．新しく file1 というファイルを作成する場合でも，この方法で起動すると， file1 という名前のバッファが開くので， C-x C-s で保存する際にファイル名を入力する必要がなくなります．

エディタとして mule を使用し文章を編集する際, 編集したい行をミニバファとウィンドウとの境にあるモードラインに表示させたいときは

Esc -x + line-number

とすればよいです. Esc はキーボート左上にあるキーです. そうすれば, モードラインが

[--]E_EE:-----Mule:*scratch*      (Lispinteraction)--L1-All------

となり, カーソルが一行目にあるときはL1 と表示されます.

3 本題

以下レジュメはキーボートに向かって座っていることを仮定して書きます. 講義終了後時間があるとき自習してください !!.

今回は，再び UNIX のコマンドに戻ります．まずは， bc コマンドです．これにより UNIX 上で電卓のような計算が出来るようになります．（電卓と計算の約束が異なる部分もあります．）

     bc

と入力した後，計算したい式を入力します．例えば，

     5+3

と入力すると

     8

と出力されます．式の最後に等号（=）を入れてはいけません．終了は， Ctrl-D です．次の式を入力してみて，電卓との違いを理解して下さい．

     12345679*27
     4+123*9
     2^5
     2^(2^5)+1
     (2^(2^5)+1)%641
     18%7

%は余りを求めます．つぎのフェルマーの小定理を確かめてみましょう．興味のある方は高木貞治著の「初等整数論」を参照してください^{1} . 但し, p は素数.

(フェルマーの小定理) a^{p−1} ≡ 1 (mod p).

     4^(7-1)%7
     3^(11-1)%11
     2^(13-1)%13

3.1 ファイルを作って一括入力する（入力リダイレクト）

今， bc での入力はキーボードから行いましたが，同じ計算を何度も行うときや，入力した式を記録しておきたい場合などは，あらかじめファイルに書いておくと便利です．次のような式を書いて，ファイル名 equation として保存して下さい．

     2^5
     2^(2^5)+1
     (2^(2^5)+1)%641
     18%7

bc にこのファイルの内容を読み込ませるには，不等号 < を使って次のように打ちます．

     bc < equation

このように，キーボードからの入力を標準入力と呼びます．標準入力をファイルからの入力に切替えることを入力リダイレクト（redirection）と呼びます．

3.2 実行結果をファイルに出力する（出力リダイレクト）

入力リダイレクトとは逆に，画面に現れる出力を不等号 > を使って，ファイルに書き込ませることも出来ます．画面に現れる出力には，標準出力と，標準エラー出力の２種類があります．不等号 > を使ってファイルへの出力に切替えられるメッセージは，標準出力の方です．

ls コマンドはファイルの一覧を画面に表示するコマンドですが，

     ls -l > filelist

とすると，画面には表示される代わりに， filelist というファイルが作られその中に， ls で表示される筈の内容が書き込まれます． filelist の中身を確かめてみて下さい．

     cat filelist

簡単な内容のファイルの作成は， cat コマンドと出力リダイレクトとの組合せが便利です． cat は引数なしで実行すると入力した文字列をそのまま画面に返します．

     cat

と入力した後，

     hiroko

1 高校の教師になる方は必読です

と入力すると画面には

     hiroko
     hiroko

と出ている筈です．１行目は入力された文字列２行目は出力された文字列です．リダイレクトを使ってみましょう．

     cat > speed

としてから，ファイルに書き込む内容を直接入力します．練習のため次の名前を入力してみましょう．

     hiroko
     takako

終了は Ctrl-D です．正しくファイルに書かれているかどうか， cat speed で確認して下さい．この方法では，間違って入力した場合に修正は出来ませんが，出力リダイレクト >> （不等号２つ）を使うと，既に存在するファイルに出力結果を追加することが出来ます．

     cat >> speed

と打って，次の名前を追加します．

     eriko
     hitoe

終了は， Ctrl-D です．ファイルの内容は， cat speed で確かめられます．

3.3 パイプ

あるコマンドの出力結果を別のコマンドの入力として使いたいときは，パイプ | を使います．例えば， /usr/bin には，たくさんのコマンドが入っていますが， ls -l /usr/bin とすると，出力される行数が多すぎて，一つの画面の収まりません．一方 less コマンドは，ファイルの内容をページごとに出力してくれます．このような場合，パイプを使うと便利です．

     ls -l /usr/bin | less

less では，１行先をみるときは， j を１行戻るときは， k を押します．終了は， q です．

もう１つ例をみてみましょう． sort コマンドは，入力されたファイルを行単位で順番に並べかえるコマンドです．先程作成した， speed を使ってみます．

     cat speed | sort

次のように表示されるはずです．

     eriko
     hiroko
     hitoe
     takako

3.4 標準エラー出力のリダイレクト

画面に表示されるメッセージには，２種類あると述べましたが，標準エラー出力の方は，その名の通り，エラーメッセージです．

例えば， ls -l speed と入力すると，ファイル speed の情報が画面に表示されますが， ls -l max と入力すると，

max: ファイルまたはディレクトリがありません。

というメッセージが表示されます．これが標準エラー出力です．

標準エラー出力は，標準出力とは別のものですから，出力リダイレクト > では，ファイルへの出力に切替えることはできません．実験してみましょう．

     ls -l speed max > stdmsg

最初の ls -l speed の結果は，出力が切替えられましたから，画面には，表示されませんね． ls - l max に関するエラーメッセージは，画面に表示された筈です．

標準出力とエラーメッセージ (標準エラー出力) をあわせて，画面への出力全部を一般のファイルへの出力に切替えるには， >& を使います．実験してみましょう．

     ls -l speed max >& errmsg

今度は，何も画面には出力されない筈です．ファイル errmsg の中身も cat で確かめておいて下さい．

3.5 リダイレクトの組合せ

リダイレクトの組合せを見てみましょう．

計算すべき式をファイルに書いておき，答えもファイルに残したいときは，入力リダイレクトと出力リダイレクトを組み合わせます．

     bc < equation > answer

これで出力結果がファイル answer に書き込まれます．

標準出力と標準エラー出力を別々のファイル stdmsg と errmsg に保存したいときは，次のようにします．

     (ls -l speed max > stdmsg) >& errmsg

センターの設定では，すでに存在するファイルに出力を切替えようとすると，上書き防止のためにエラーになりますから，ファイル stdmsg と errmsg が存在する場合は，一旦ファイルを消去してから，上のコマンドを試みて下さい．

結果の確認は， cat stdmsg および cat errmsg で行って下さい．

3.6 その他のリダイレクトとパイプ（余裕のある人は調べて）

リダイレクトやパイプには上述のものの他に次のようなものがあります.

     >>&, >!, >>!, >&!, >>&!, |&

4 カット＆ペースト, コピー＆ペースト

mule でテキストを編集するときに役たつ二つの方法について説明します. 注意: C-SPACE は CTRL + SPACE キーを意味します.

4.1 カット＆ペースト

テキストを移動するときに用いられる方法で、次の手順でおこないます.

• 移動元の先頭にポイントを合わせ、 C-SPACE を入力 (マークがセットされる)

• 移動元の最後にポイントをあわせ、 C-w を入力 (マークとポインタで挟まれた部分が消える)

• 移動先にポインタを合わせ、 C-y を入力 (消えた部分がポインタ位置に挿入される)

4.2 コピー＆ペースト

テキストをコピーするときに用いる方法で、次の手順でおこないます.

• 移動元の先頭にポイントを合わせ、 C-SPACE を入力 (マークがセットされる)

• 移動元の最後にポイントをあわせ、 M-w を入力 (マークとポインタで挟まれた部分がコピーされる)

• 移動先にポインタを合わせ、 C-y を入力 (ポインタ位置にコピーされた部分が挿入される)