Cシェル入門 - コマンド形式の基礎 (2)
前回に引き続き、Cシェルの勉強をします
コマンド行の修正
historyコマンドの利用
Cシェルは 入力した コマンドの リストを 保存して います。
この 履歴 (history) 機構に よって、 履歴 リスト中の コマンドを 選択あるいは
修正して 使用する ことが できます。
保存できる コマンドの 数は、 history 変数で 指定できます。
例えば
sw99% set history = 40
|
とすれば、 最大 40個まで コマンドを 保存できます。
(皆さんの 場合、 この 値が 自動的に 設定されて いるはずです。
どのように 設定されて いるかは, echo $history
という コマンドを 実行すれば わかります。
あまり 大きく 取ると、 シェルの 効率が 下がります。)
過去の コマンド行を 見るには history コマンドを 使います。
sw99% ls
........
sw99% history
1 set history=40
2 ls
3 history
|
コマンドの置換と繰り返し
直前の コマンドを、 一部 修正して 繰り返したい
場合は、 コマンド置換が 便利です。
sw99% mdkir animals
mdkir: コマンドが見つかりません。
|
mkdir と するところを 間違えて、 mdkir と 打って
しまいました。
これを 修正して 実行する には
sw99% ^dk^kd
mkdir animals
|
のようにします。
修正する こと なしに、 もう一度 実行する なら、!! と
だけ 入力します。
sw99% !!
mkdir animals
mkdir: ディレクトリの作成に失敗しました。 "animals"; ファイルが存在します。
|
修正した 結果を 実行せずに コマンド行の
確認だけを おこないたい のなら、 置換の 後に
^:p を 付けます。
sw99% mdkir vegitables
mdkir: コマンドが見つかりません。
sw99% ^dk^kd^:p
mkdir vegitables
sw99% !!
mdkir vegitables
|
直前の コマンドの 最後の 1語を !$で 表します。
sw99% ls !$
ls vegitables
|
履歴番号を 使って 過去の コマンドを もう一度
実行させる ことも できます。
sw99% history
1 set history=40
2 ls
3 history
....
sw99% !2
ls
....
|
履歴番号を現在の番号から見た相対的な数で表すには - 記号を使います。
sw99% !-3
ls vegitables
|
また、 履歴の 中から パターンの 一致する
コマンドを 探して 実行する 機能も あります。
sw99% !hi
history
|
プロセス PID
Cシェルが コマンドを 解釈すると、 プロセス 識別番号 PID
を 持つ 独立の プロセスが
生成され、 コマンドを 実行します。
システムは、 各プロセスの 状態を 監視する ために PID を 使用します。
実行中のコマンドは?
実行中の コマンドを 調べるには、 ps コマンドを 使います。
sw99% ps
PID TTY TIME CMD
18003 pts/2 0:00 csh
|
ps コマンドで 表示される 情報に ついては、 man ps を
参考に してください。
さしあたり 重要なのは、 PID です。
プロセスを止める
kill コマンドを 使うと、 実行中の プロセスを
止める ことが できます。
ワークスペース メニューから、 時計ツールを 起動して みてください。
コマンド ツール で ps に -u username オプションを つけて 実行すると、
時計の PID を 知ることが できます。
-u オプションは その端末 (cmdtool) 以外から
実行されて いる プロセスも 表示します。
時計が、 clock という コマンド名を 持っている ことを 知っていれば、
grep を使って ps の出力の中から検索できます。
sw99% ps -u 99ss999 | grep clock
18018 ? 0:02 clock
|
ここで 知った PID を 使って、 killコマンドを 実行します。
sw99% kill -KILL 18018
|
番号は それぞれの 計算機で 違います ので 注意して ください。
バックグラウンドでコマンドを実行する
UNIX では 複数の コマンドを 同時に 実行する ことが できます。
コマンドを バックグラウンドで 実行するには、 コマンド行の 最後に & を 付けます。
sw99% clock &
[1] 18023
|
ここで もし、 & を 付けないと 時計が 終了する まで、 コマンドツールからの
実行は できません。
sw99% clock
|
しかし、 端末で Ctrl+Z を タイプすると、
のように、 プロンプトが 表示される ように なります。
このとき、 プロセスは 停止状態に なっています。
停止させた プロセスを バックグラウンドで 継続させるには、
bg コマンドを 使います。
sw99% bg
[2] + clock &
|
バックグラウンドで 実行中の プロセスを ジョブと 呼びます。
ジョブの 状態を 表示させる には、 jobs コマンドを 使います。
sw99% jobs
[1] - Running clock
[2] + Running clock
|
バックグラウンドジョブを 終了させるには、 kill % コマンドを
使います。% の 後には、 jobs で 知った 番号を 付けます。
sw99% kill %1
sw99%
[1] 異常終了 1 clock
|
シェルの終了
現在端末で実行中のシェルそのものを終了させたい時には、
exit コマンドを入力します。
コマンドツールでシェルを実行中の場合には、コマンドツールの
ウィンドウも終了します。
リモート端末からログインしている場合には、ログアウトします。
補足:プロセスとジョブ
UNIXシステムでは様々の仕事を、切り替えながら実行することで、
同時に実行させることができます。この「仕事」をプロセスと
呼びます。Cシェルの役割はユーザからのコマンド入力を受けて
適当なプロセスを生成することにあります。
生成されるプロセスはは1つのこともあれば、|や;
を使って複数のプロセスが同時または連続に生成することも
あります。これらの一つまたは複数のプロセスの集まりを
ジョブと呼びます。
通常はジョブが終了すると Cシェルは次のコマンドを受け付ける
ことができるようになりますが、コマンド終了を待たずに次の
コマンド入力ができるようにするのが、バックグラウンドでの
実行です。バックグラウンドの反対はフォアグラウンドで
こちらはコマンド入力ができなくなる通常のジョブです。
ジョブにはCシェルによって番号が付けられます。
ジョブ番号とプロセス番号は違いますので、区別して扱って下さい。
なお、プロセスの生成はシェルだけが持つ機能ではなく、forkという
名前のシステムコールで実現できます。生成されたプロセスを子プロセス、
生成させた方を親プロセスと呼びます。全てのプロセスは親子関係を
持っていて、子プロセスの終了は親プロセスに伝えられます。
ですから、UNIXでは子は親より先に死ぬことになります。
たまに子より親が先に死んでしまうと、子は終了を伝える相手がいなくて
死にきれない状態になります。これをゾンビプロセスと呼びます。
補足2:シェル変数 と 環境変数
Cシェルの中では、 path や history といったシェル変数
と、MANPATH や OPENWINHOME といった環境変数とが用いられて
います。シェル変数は set コマンドで、環境変数は setenv コマンドで
設定されます。シェル変数は実行中のシェルの中だけで有効ですが、
環境変数はシェルから起動されるコマンドでも有効です。
補足3:.cshrc と .login
例えば、Cシェルを起動するたびに set history = 40 と入力する
のは大変です。シェルを起動する時には、~/.cshrc が実行されます。
.cshrc には path や history などのシェル変数設定のコマンドを
書いておきます。また、ログインの際に必ず OpenWindows を起動する
などの場合には、~/.login にコマンドを書いておきます。これは
ログインの時に一度だけ実行されますが、コマンドツールの起動の
時には実行されません。環境変数は引き継がれますので .login に
書けばよいということになります。
- history 変数を 10 に設定しなさい。
- ~/core-info ディレクトリに移動しなさい。
- type hello と入力してエラーになることを確かめなさい。
- ^ を使って type を cat で置き換えなさい。
- sleep コマンドは 引数で与えられた秒数だけ停止状態を作ります。
sleep 10 で 10秒間停止することを確かめなさい。
- バックグラウンドで 30秒間の停止状態を作り、jobs で確かめなさい。
- 同じく停止状態プロセスを ps で確かめなさい。
- history の出力を担当教員までメールしなさい。