[目次] [前回] [次回] [重要語索引]

第6週: プログラムの実行

6. 1 プログラムとプロセス
6. 2 練習問題
6. 3 標準入出力
6. 4 練習問題
6. 5 シェルのジョブ管理機能
6. 6 練習問題
6. 7 プログラムの動作の変更
6. 8 練習問題
6. 9 シェルのその他の機能
6.10 練習問題
6.11 宿題
6.12 おまけ

6.1 プログラムとプロセス

プログラム(program)とは、コンピュータに対して、どのような手順で仕事をすべきかを書いたものです。 コンピュータが動いているのは、誰かがプログラムを書いたからです。

ls コマンドを実行すると、ディスクから /usr/ucb/ls の内容が主記憶に読み込まれ、CPU がそこに書かれた手順を実行します。 CPU がプログラムを実行している状態を、プロセス (process)と呼びます。

6.2 練習問題

  1. xclock & を実行し,ps コマンドの表示を確認しなさい.
  2. kill コマンドで上の xclock を終了させなさい.

6.3 標準入出力

プログラムがユーザと情報をやり取りする方法は,主に次の二つです.

X ウィンドウの方が初心者には親切ですが,標準入出力には次のような利点があるため,熟練者には広く使われています.

標準入出力とファイル引数の関係

X ウィンドウを使わないコマンドが必ず標準入出力を使うわけではありません.入力と出力のそれぞれについて,コマンドは次の3つのタイプに分けることができます.

  1. 標準入出力を使わない.ファイルや X ウィンドウやネットワークとデータのやり取りをする.
  2. 必ず標準入出力を使う.
  3. 引数でファイルが指定されると,そのファイルとデータのやり取りをする.引数が指定されないと,標準入出力を使う.

例えば,ls コマンドは入力がタイプ1で出力がタイプ2です.lpr コマンドは入力がタイプ3で出力がタイプ1です.

リダイレクション

37ページ

標準入出力は,キーボード入力と端末ウィンドウに接続されているのが普通ですが,この接続をファイルに切り替えることができます.これをリダイレクション(redirection)と言います.

パイプ

あるコマンドの出力と,別のコマンドの入力を接続するには,二つのコマンドを「|」(縦棒)で区切って書きます.これをパイプ(pipe)と言います.

例えば,a2ps コマンドは結果を標準出力に出します4.7 プリンタに関するコマンド.それを lpr コマンドでプリンタに送るには

% a2ps test | lpr -Pnps15
%

とします.これは

% a2ps <test >xxx
% lpr -Pnps15 <xxx
%

とするのと同じです.また,ls -l の結果を印刷したい時は

% ls -l | a2ps | lpr -Pnps15
%

とします.

6.4 練習問題

  1. ls -l と grep をパイプでつないで,カレントディレクトリの中でアクセス権が rw-r--r-- のものだけを表示しなさい.4.5 ファイルの保護4.3 検索と置換

6.5 シェルのジョブ管理機能

39ページ

フォアグラウンドとバックグラウンド

端末ウィンドウでコマンドを入力すると,シェルがそれを受け取り,コマンドを起動します.シェルはコマンドが終了するまで休止状態になるので,端末ウィンドウではコマンドだけが動いているように見えます.このようなコマンドの実行方法をフォアグラウンドジョブ(foreground job)と言います.

これに対して,コマンドの後に「&」を付けて実行すると,シェルが休止状態にならないので,続けて他のコマンドを実行できます.このようなコマンドの実行方法をバックグラウンドジョブ(background job)と言います.

ジョブ管理

現在のシェルで実行しているバックグラウンドジョブは, jobs コマンドで知ることができます.

% jobs
[2]  + Running    xdvi -expert -s 5 08.dvi
[3]  - Running    netscape
%

最初に書いてある数字がジョブ番号です.ジョブ番号を他のコマンドの引数として使う時は,前に「%」を付けます.

バックグラウンドジョブをフォアグラウンドに変更するには,fg コマンドで

% fg %2
xdvi -expert -s 5 08.dvi
とします.逆に,フォアグラウンドジョブを バックグラウンドにするためには, まず,C-z により,フォアグラウンドジョブを一時停止させる必要があります.
^Z
Suspended
% jobs
[2]  + Suspended  xdvi -expert -s 5 08.dvi
[3]  - Running    netscape
%
この状態ではジョブは停止しています.バックグラウンドにするには, bg コマンドを使って
% bg %2
[2]    xdvi -expert -s 5 08.dvi
%
とします.fg コマンドおよび bg コマンドにおいてジョブ番号を省略すると, jobs コマンドの表示で + のついているジョブに対して操作が行われます.

ジョブ管理をまとめると,次のようになります.

6.6 練習問題

  1. 端末ウィンドウで emacs (& をつけない)を実行し,シェルのプロンプトが出ないことを確認しなさい.
  2. 上の emacs を一時停止させなさい.この状態で emacs のウィンドウを操作するとどうなりますか?
  3. 上の emacs をバックグラウンドジョブにしなさい.

6.7 プログラムの動作の変更

プログラムを作る時は,ユーザが必要に応じてプログラムの動作を変更できるように作るのが普通です.プログラムの動作を後から微調整することをカスタマイズ(customize)と言います.カスタマイズのやり方には大雑把に言うと次の2種類があります.

  1. システムの管理者が,組織の実情に応じて,ユーザみんなのために行う.
  2. ユーザが,自分の好みや仕事の内容に応じて行う.

CNS では1のタイプのカスタマイズも多く行われていますので,研究室のコンピュータを使う時は注意して下さい.次に2のタイプのカスタマイズについて説明します.

環境変数

46ページ

変数とは,一般にある値を記憶しておく箱で,値をいろいろ変化させることができます.環境変数(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
%

プログラムによってどの環境変数を参照するかは決まっていますので,それぞれのプログラムのマニュアルを調べて下さい.例として次のようなものがあります.

注意: 一つの端末ウィンドウで環境変数の値を変更しても,他の端末ウィンドウには影響しません.

設定ファイル

Web版のみ

ホームディレクトリにある「.」(ピリオド)で始まるファイルには,プログラムが起動する時に読み込む設定を書いてあるものが多くあります.プログラム本体はすべてのユーザが同じものを使いますが,設定ファイルは各ユーザごとに違う内容を書けるので,ユーザごとに違う動作をさせることができます.

主な設定ファイルには次のようなものがあります.

設定ファイルの書き方はプログラムによって違いますので,それぞれのプログラムのマニュアルを調べて下さい.例えば,.phonerc の中に

set code jis
と書いておけば,phone を起動すると自動的にかなモードになります. 5.9 他のユーザとの会話

注意: .login や .cshrc を書き換える場合は,まず別のファイルにコピーして,元の状態に戻れるようにしておきましょう.また,.xsession に変な設定を書くと,X ウィンドウでログインができなくなることがあります.

6.8 練習問題

  1. LANG の値を次のように変更してdate コマンドや man コマンドを使ってみなさい.
    1. unsetenv LANG
    2. setenv LANG de
    3. setenv LANG ja
  2. unsetenv DISPLAY を実行してから xclock を実行してみなさい.
  3. .cshrc に
    date
    という行を追加し(すでにある行は変更しないこと),新しく端末ウィンドウを作ってみなさい.

6.9 シェルのその他の機能

32ページ

ファイル名の展開

ファイルの数が多くなってくると,それをすべて列挙するのが大変になってきます.そこでシェルには,あるパターンのファイル名をまとめて指定する仕組みが用意されています.「*」,「?」,「[」,「]」,「{」,「}」,「~」は,複数の文字や文字列を代表するための特別な文字です.このような文字をメタキャラクタ(meta character)と言います. ポーカーでジョーカーが他のどんなカードの代わりにでも使えるのと似ているので,ワイルドカードと呼ぶ人もいます.注意: emacs や grep で使う正規表現とは,似ていますが違うものです.4.10 おまけ

メタキャラクタを含む引数があると,シェルは以下の規則に従って合致するファイル名を探し,合致したファイル名全部と置き換えます.

例えば,カレントディレクトリのすべてのファイルの中から happy という文字列を探したければ,

% grep happy *
とします.ファイル名が .txt か .text で終わるファイルだけを探す対象にしたければ,
% grep happy *.{txt,text}

とします.

注意: 「.」で始まるファイル名は特別扱いなので,単に「*」としただけでは合致しません.

コマンドラインの編集

入力中のコマンドを,emacs のキー操作と同じ要領で編集することができます.また,前に実行したコマンドを覚えているので,上矢印キーまたは C-p で一つ前のコマンド,下矢印キーまたは C-n で一つ後のコマンドを呼び出すことができます.

エイリアス

よく使うコマンドに対して省略形を定義することができます.詳しくは CNS ガイドを参照して下さい.

シェル変数

環境変数と似ていますが,シェルの動作を決めるための変数なので,シェル以外のプログラムとは関係ありません.詳しくは CNS ガイドを参照して下さい.

例として,シェルのプロンプトを下線付きでホスト名とカレントディレクトリを表示するように設定してみます.

% set prompt="%U%m:%c%%%u "
zz000:~% cd /pub/sfc/ipl
zz000:ipl%

6.10 練習問題

カレントディレクトリを /pub/sfc/ipl/1a/exercise/filename にし,ls コマンドで中にあるファイル名を確認しなさい.

  1. ls a* を実行するとどうなるでしょう.
  2. ls a? を実行するとどうなるでしょう.
  3. ls a?? を実行するとどうなるでしょう.
  4. ファイル名が a で始まって e で終わるものだけを表示するにはどうすればよいでしょう.
  5. ls [ab]* を実行するとどうなるでしょう.
  6. ls [^a]* を実行するとどうなるでしょう.

6.11 宿題

  1. phone を起動すると自動的にかなモードになるようにしなさい.
  2. 最後の練習問題で ls .* を実行するとどうなるでしょう.なぜこのようになるのでしょうか.3.7 ファイルのパス名
  3. rm * をうっかり実行してしまうと危険なので,ファイルを削除する前に y/n で確認するようにしてみましょう.
    1. rm コマンドで,ファイルを削除する前に確認するオプションは何か,マニュアルを見て調べなさい.
    2. rm というエイリアスを,rm コマンドに上のオプションを付けたものに設定しなさい.
    3. 上のエイリアスが常に有効になるようにしなさい.

6.12 おまけ

emacs のカスタマイズ

emacs のカスタマイズは,Emacs Lisp の式を書くことにより行いますが,初心者には難しいので,手助けをしてくれる機能が用意されています.

シェルによるプログラム

シェルには繰り返しや条件判断の機能があるので,簡単なプログラムを書くことができます.例えば,カレントディレクトリのすべてのファイル名の後に .old を付けたい場合,mv * *.old ではうまくいきません.それぞれのファイルについて mv コマンドを実行しなければいけないので,繰り返しを行う foreach コマンドを使って次のようにします.

% foreach i (*)
foreach? mv $i $i.old
foreach? end
%
詳しくは csh のマニュアルや市販の参考書を見て下さい.
[目次] [前回] [次回] [重要語索引]

慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 2000 慶應義塾大学