6. 1 プログラムとプロセス 6. 2 練習問題 6. 3 標準入出力 6. 4 練習問題 6. 5 シェルのジョブ管理機能 6. 6 練習問題 6. 7 プログラムの動作の変更 6. 8 練習問題 6. 9 シェルのその他の機能 6.10 練習問題 6.11 宿題 6.12 おまけ
プログラム(program)とは、コンピュータに対して、どのような手順で仕事をすべきかを書いたものです。 コンピュータが動いているのは、誰かがプログラムを書いたからです。
% which ls /usr/ucb/ls %
ls コマンドを実行すると、ディスクから /usr/ucb/ls の内容が主記憶に読み込まれ、CPU がそこに書かれた手順を実行します。 CPU がプログラムを実行している状態を、プロセス (process)と呼びます。
プロセス番号,端末名,状態,実行時間,実行コマンドが表示されます.
% ps PID TT S TIME COMMAND 11491 pts/0 S 0:00 -tcsh 11505 pts/0 R 0:01 emacs 11507 pts/1 R 0:00 /bin/tcsh -i 10396 pts/2 S 0:00 -tcsh 10835 pts/2 S 0:01 twm %
kill でも死なない手強いプロセスには、kill -9 を試してみましょう。
% kill 10835 %
プログラムがユーザと情報をやり取りする方法は,主に次の二つです.
X ウィンドウの方が初心者には親切ですが,標準入出力には次のような利点があるため,熟練者には広く使われています.
X ウィンドウを使わないコマンドが必ず標準入出力を使うわけではありません.入力と出力のそれぞれについて,コマンドは次の3つのタイプに分けることができます.
例えば,ls コマンドは入力がタイプ1で出力がタイプ2です.lpr コマンドは入力がタイプ3で出力がタイプ1です.
標準入出力は,キーボード入力と端末ウィンドウに接続されているのが普通ですが,この接続をファイルに切り替えることができます.これをリダイレクション(redirection)と言います.
% ls -l >xxx %
% more xxx total 813 drwx------ 4 hattori 512 Apr 15 17:50 Mail drwxrwxrwx 4 hattori 512 May 6 16:01 Wnn -rw-r--r-- 1 hattori 76 Apr 19 15:10 test %
% more <xxx total 813 drwx------ 4 hattori 512 Apr 15 17:50 Mail drwxrwxrwx 4 hattori 512 May 6 16:01 Wnn -rw-r--r-- 1 hattori 76 Apr 19 15:10 test %
あるコマンドの出力と,別のコマンドの入力を接続するには,二つのコマンドを「|」(縦棒)で区切って書きます.これをパイプ(pipe)と言います.
例えば,a2ps コマンドは結果を標準出力に出します4.7
プリンタに関するコマンド.それを lpr コマンドでプリンタに送るには
% a2ps test | lpr -Pnps15 %
とします.これは
% a2ps <test >xxx % lpr -Pnps15 <xxx %
とするのと同じです.また,ls -l の結果を印刷したい時は
% ls -l | a2ps | lpr -Pnps15 %
とします.
端末ウィンドウでコマンドを入力すると,シェルがそれを受け取り,コマンドを起動します.シェルはコマンドが終了するまで休止状態になるので,端末ウィンドウではコマンドだけが動いているように見えます.このようなコマンドの実行方法をフォアグラウンドジョブ(foreground job)と言います.
これに対して,コマンドの後に「&」を付けて実行すると,シェルが休止状態にならないので,続けて他のコマンドを実行できます.このようなコマンドの実行方法をバックグラウンドジョブ(background job)と言います.
現在のシェルで実行しているバックグラウンドジョブは, jobs コマンドで知ることができます.
% jobs [2] + Running xdvi -expert -s 5 08.dvi [3] - Running netscape %
最初に書いてある数字がジョブ番号です.ジョブ番号を他のコマンドの引数として使う時は,前に「%」を付けます.
バックグラウンドジョブをフォアグラウンドに変更するには,fg コマンドで
とします.逆に,フォアグラウンドジョブを バックグラウンドにするためには, まず,C-z により,フォアグラウンドジョブを一時停止させる必要があります.
% fg %2 xdvi -expert -s 5 08.dvi
この状態ではジョブは停止しています.バックグラウンドにするには, bg コマンドを使って
^Z Suspended % jobs [2] + Suspended xdvi -expert -s 5 08.dvi [3] - Running netscape %
とします.fg コマンドおよび bg コマンドにおいてジョブ番号を省略すると, jobs コマンドの表示で + のついているジョブに対して操作が行われます.
% bg %2 [2] xdvi -expert -s 5 08.dvi %
ジョブ管理をまとめると,次のようになります.
プログラムを作る時は,ユーザが必要に応じてプログラムの動作を変更できるように作るのが普通です.プログラムの動作を後から微調整することをカスタマイズ(customize)と言います.カスタマイズのやり方には大雑把に言うと次の2種類があります.
CNS では1のタイプのカスタマイズも多く行われていますので,研究室のコンピュータを使う時は注意して下さい.次に2のタイプのカスタマイズについて説明します.
変数とは,一般にある値を記憶しておく箱で,値をいろいろ変化させることができます.環境変数(environment variable)とは,プログラムが実行時に周囲の状況を参照するための変数です.環境変数には名前(普通はアルファベットの大文字だけを使います)がついていて,値として文字列を記憶します.
現在の環境変数の値の一覧を表示するには printenv コマンドを使います.
% printenv TZ=Japan TERM=vt220 PATH=/usr/local/lib/jdk1.2.1/bin:/usr/local/lib/jdk1.1.5/bin:/home/hattori/bin:/ usr/local/bin:/usr/bin/X11:/usr/local/bin/mh:/usr/local/mh:/usr/local/bin/X11:/p ub/sfc/bin:/usr/ucb:/usr/bin:/bin:/usr/bsd:/usr/sony/bin:/usr/new:.:/usr/local/X 11R6.3/bin:/usr/local/SUNWspro/bin:/usr/openwin/bin:/opt/SUNWo1kp/bin:/usr/ccs/b in:/usr/sbin:/pub/sfc/bin:/usr/local/bin:/usr/local/bin/mh:.:/home/hattori/bin HOME=/home/hattori MAIL=/var/mail/hattori LOGNAME=hattori SHELL=/bin/tcsh HOSTTYPE=sun4 %
= の左側が名前,右側がその変数の値です.引数に環境変数名を書くと,その値だけを表示します.
環境変数を新しく作る,または値を変更するには setenv コマンドを使います.
% setenv POKEMON pikachu % printenv POKEMON pikachu %
環境変数を削除するには unsetenv コマンドを使います.
% unsetenv POKEMON % printenv POKEMON %
プログラムによってどの環境変数を参照するかは決まっていますので,それぞれのプログラムのマニュアルを調べて下さい.例として次のようなものがあります.
注意:
一つの端末ウィンドウで環境変数の値を変更しても,他の端末ウィンドウには影響しません.
ホームディレクトリにある「.」(ピリオド)で始まるファイルには,プログラムが起動する時に読み込む設定を書いてあるものが多くあります.プログラム本体はすべてのユーザが同じものを使いますが,設定ファイルは各ユーザごとに違う内容を書けるので,ユーザごとに違う動作をさせることができます.
主な設定ファイルには次のようなものがあります.
設定ファイルの書き方はプログラムによって違いますので,それぞれのプログラムのマニュアルを調べて下さい.例えば,.phonerc の中に
と書いておけば,phone を起動すると自動的にかなモードになります.
set code jis
注意:
.login や .cshrc を書き換える場合は,まず別のファイルにコピーして,元の状態に戻れるようにしておきましょう.また,.xsession
に変な設定を書くと,X ウィンドウでログインができなくなることがあります.
という行を追加し(すでにある行は変更しないこと),新しく端末ウィンドウを作ってみなさい.
date
ファイルの数が多くなってくると,それをすべて列挙するのが大変になってきます.そこでシェルには,あるパターンのファイル名をまとめて指定する仕組みが用意されています.「*」,「?」,「[」,「]」,「{」,「}」,「~」は,複数の文字や文字列を代表するための特別な文字です.このような文字をメタキャラクタ(meta
character)と言います. ポーカーでジョーカーが他のどんなカードの代わりにでも使えるのと似ているので,ワイルドカードと呼ぶ人もいます.注意:
emacs や grep で使う正規表現とは,似ていますが違うものです.
4.10
おまけ
メタキャラクタを含む引数があると,シェルは以下の規則に従って合致するファイル名を探し,合致したファイル名全部と置き換えます.
例えば,カレントディレクトリのすべてのファイルの中から happy という文字列を探したければ,
とします.ファイル名が .txt か .text で終わるファイルだけを探す対象にしたければ,
% grep happy *
% grep happy *.{txt,text}
とします.
注意:
「.」で始まるファイル名は特別扱いなので,単に「*」としただけでは合致しません.
入力中のコマンドを,emacs のキー操作と同じ要領で編集することができます.また,前に実行したコマンドを覚えているので,上矢印キーまたは C-p で一つ前のコマンド,下矢印キーまたは C-n で一つ後のコマンドを呼び出すことができます.
よく使うコマンドに対して省略形を定義することができます.詳しくは CNS ガイドを参照して下さい.
環境変数と似ていますが,シェルの動作を決めるための変数なので,シェル以外のプログラムとは関係ありません.詳しくは CNS ガイドを参照して下さい.
例として,シェルのプロンプトを下線付きでホスト名とカレントディレクトリを表示するように設定してみます.
% set prompt="%U%m:%c%%%u " zz000:~% cd /pub/sfc/ipl zz000:ipl%
カレントディレクトリを /pub/sfc/ipl/1a/exercise/filename にし,ls コマンドで中にあるファイル名を確認しなさい.
emacs のカスタマイズは,Emacs Lisp の式を書くことにより行いますが,初心者には難しいので,手助けをしてくれる機能が用意されています.
シェルには繰り返しや条件判断の機能があるので,簡単なプログラムを書くことができます.例えば,カレントディレクトリのすべてのファイル名の後に .old を付けたい場合,mv * *.old ではうまくいきません.それぞれのファイルについて mv コマンドを実行しなければいけないので,繰り返しを行う foreach コマンドを使って次のようにします.
詳しくは csh のマニュアルや市販の参考書を見て下さい.
% foreach i (*) foreach? mv $i $i.old foreach? end %
慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 2000 慶應義塾大学