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 を タイプすると、
^Z
停止 (利用者要求による)
sw99%
のように、 プロンプトが 表示される ように なります。 このとき、 プロセスは 停止状態に なっています。 停止させた プロセスを バックグラウンドで 継続させるには、 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 に 書けばよいということになります。

練習問題

  1. history 変数を 10 に設定しなさい。
  2. ~/core-info ディレクトリに移動しなさい。
  3. type hello と入力してエラーになることを確かめなさい。
  4. ^ を使って type を cat で置き換えなさい。
  5. sleep コマンドは 引数で与えられた秒数だけ停止状態を作ります。
    sleep 10 で 10秒間停止することを確かめなさい。
  6. バックグラウンドで 30秒間の停止状態を作り、jobs で確かめなさい。
  7. 同じく停止状態プロセスを ps で確かめなさい。
  8. history の出力を担当教員までメールしなさい。