電子計算機及び実習 第 7 回 (11/17)
7 シェル
7.1 今日のテーマ
*シェル(shell)
**今日の提出課題
以下のファイルを添付して, s-suzuki宛に署名をつけて送信せよ.ただし,Subjectは「学籍番号+Nov17」とせ よ.また,メールの本文に添付したファイルの名前を明記すること.これらの指定が守られていない場合, 減点対 象となる.
なお,1,2,3,4は必須問題,5は余裕のあるもののみ提出せよ.
1. ans7.txt 課題7.1,7.8の結果.
2. .my-tcshrc(エイリアスが設定されているもの) 課題7.3の結果.
3. keys.txt 課題7.4の結果.
4. process.txt 課題7.5の結果.
5. finger.txt 課題7.9の結果.
7.2 シェル
シェルとは,ユーザとUNIX OSの核の部分(カーネルと呼ばれている)との間を取り持つプログラムである.
ユーザはシェルを通じて,様々な命令を発することができる.さらに,シェルのコマンドを組み合わせるなどす ることで,シェルスクリプトと呼ばれるプログラムを作成しより複雑な命令を実行することもできる.
通常,UNIXにログインすると,ログインシェルとして一つのシェルが起動し,ログアウトすると終了する.ま た,ktermなどの端末エミュレータを起動すると,シェルが一つ起動し,端末エミュレータを終了するとそのシェ ルは終了する.
ktermを起動すると,jxxxxx@nodat001> のように表示されるが,これがシェルのコマンドプロンプト(単 にプロンプトともいう)とよばれるもので,このプロンプトの後に,様々なコマンドを入力することで,色々な 命令を実行することができることは,すでに体験したとおりである.
シェルにも,様々なものがある.代表的なものとして,sh, csh, bash, tcsh, zshなどがある.総合情報シ ステム部の設定では,tcsh (TC shell)が使われるようになっている.この講義でも,tcshを使っている.
シェルのより詳しい説明については,「手引き」UNIX編の第5章を参照するとともに,ウェブ上にある情報も 検索・参照して欲しい.
7.2.1 パス
以前説明したように,UNIXは記憶装置(ハードディスクなど)を,図1のようなツリー状のディレクトリ構 造によって管理している.一番上に位置するルートディレクトリ(/であらわす)の下にいくつかのサブディレ クトリがあり,その内の/homeというディレクトリの下に各ユーザが自由に操作することのできるホームディレ クトリが配置されており,ユーザがシステムにログインした際には,最初にこのホームディレクトリを訪れるこ とになるのであった.また,コマンドcdを用いればディレクトリを移ることができたし,現在自分がどのディレ クトリにいるのかを確かめるのにはコマンドpwdを用いれば良く,現在のディレクトリのことをカレントディレ クトリと呼ぶのであった(ログインした時のカレントディレクトリはホームディレクトリのはずである).
では,ツリー構造の中のある場所にあるファイルやディレクトリを指定するにはどうすればいいだろうか?こ の場所を指定するための,コンピュータ内における住所に相当するような文字列を,パスという.例えば,カレ
ントディレクトリがホームディレクトリの下のjwww の時に,カレントディレクトリをホームディレクトリの下 の texというサブディレクトリに変更するには,以下の2通りの方法がある36:
¶ ³
1. 絶対パス による指定(ログイン名がj6107999の場合)
% cd /home/j6107/j6107999/tex
2. 相対パス による指定
% cd ../tex
µ ´
ここで,スラッシュ(/)はディレクトリを区切る記号 であり,ピリオド(.) はカレントディレクトリを,ふたつの ピリオド(..) はカレントディレクトリの一つ上のディレクトリ を表す記号である.上記の1のように,ルート ディレクトリから目的のファイルもしくはディレクトリまでの全ての道筋を指定する方法を絶対パスによる指定 といい,2のように,カレントディレクトリからの道筋を指定する方法を相対パスによる指定という.が格納されています。
/
etc var home usr tmp
jXXXX jYYYY jZZZZ
jXXXXXXX
file1 file2 Mail 通常のファイル
ディレクトリ ルートディレクトリ
図1: ディレクトリ構造
課題 7.1 以下の各問に対する答えを,ans7.txtというファイルに記入せよ.
1. ルートディレクトリ,ホームディレクトリ,カレントディレクトリ,パスの意味を説明せよ.
2. 絶対パスと相対パスの違いを説明せよ.
3. カレントディレクトリがホームディレクトリであるとき,以下の作業をする方法を,絶対パスを使った方法 と相対パスを使った方法の二通りの方法で記せ:
(a) ホームディレクトリの下の,texディレクトリの下にある EUC.texというファイルをホームディレク トリにコピーする.
(b) ホームディレクトリの下の,jwww ディレクトリの下にある index.html というファイルのパーミッ ションを644にする.
(c) /usrの下にある全てのファイルを表示する.
(d) カレントディレクトリを/homeに変更する.
ls, cp, rm, emacs, netscapeなどのUNIXの色々なコマンド・プログラムは,/bin, /usr/bin, /usr/local/bin などのディレクトリに保存されている.本来,これらのコマンドを実行するためには,それらが格納されている ディレクトリまでのパスを指定して実行しなければならない.例えば,lsを実行するには
% /usr/bin/ls
のようにしなければならないのだ.しかし,我々は今まで,単に
% ls
などとしてきた.このようなことができたのは,PATHという環境変数に検索パスが設定されていたからなので ある.このあたりの事情を次節で説明する.
36ホームディレクトリを表すメタキャラクタ(~)を使って,% cd ~/tex とすることもできる.
7.2.2 設定ファイル
シェルの使い勝手は,設定によって様々に変化する.tcshの設定は,ホームデイレクトリにある.tcshrcと いうファイルに書き込むことで行う.以下,.tcshrcを見ながら,どのような設定を行っているかを見てみよう.
¶ ³
% less .tcshrc
µ ´
として,.tcshrcの中身を表示せよ37.
lessはファイルの中身を閲覧するためのコマンドであり,閲覧中には以下のような操作ができる:
¶ ³
j 一行下に移動
k 一行上に移動
(スペースキー) 1ページ下に移動
b 1ページ上に移動
数字g その数字の行に移動
/文字列 その文字列をファイル中から順に検索
q lessの終了
µ ´
詳しい使い方は manを参照せよ.
設定ファイルの中で,#以下の文は人間用のコメントで,その部分は計算機には無視される.
総合情報システム部の設定の読み込み source ~/.cshrc
によって,総合情報システム部による既存の設定が読み込まれる.sourceというコマンドは,そのあとのファイ ルの中身を評価して,幾つかの命令を実行したり,環境設定を行ったりするためのものである.設定ファイルを 変更した場合には,「% source 設定ファイル」を行って,変更をシェルに伝える必要がある.
自分用の設定ファイル(.my-tcshrc)の読み込み .tcshrcの最後にある
source ~/.my-tcshrc
によって,自分用の設定ファイルを読み込む.このファイルに,自分専用のエイリアス(別名,後で説明する)や 環境変数の設定をすることにしよう.この部分がコメントアウトされている場合は,コメント(#)を外しなさい.
プロンプトの設定
set prompt="%n@%m[%c2]%# "
の項で,プロンプトの設定が行われる.ここを変更すると,プロンプトが変わる.
環境変数 PATHの変更
PATH環境変数は検索パスを設定するためのもので,これが指定されていると,コマンドを実行した際に,こ の変数で指定された場所(パス)からそのコマンドを探してきて実行してくれるようになる.本来,あるコマンド を実行するためには,そのコマンドがどこにあるかパスを指定する必要があるのだが,PATHに指定されたディ レクトリの下にあるコマンドに関しては,そのコマンド名だけを入力すればいいのである.このおかげで,ls, cd, mv, rm, emacs, netscapeなどのコマンドをパスを指定することなく使えていたのだ.
セキュリティ上の理由から,標準の設定から カレントディレクトリ(.)を取り除くことにした.setenv PATH 以下のところで,これを行っている.また,さらに別のディレクトリを追加したい場合には,
setenv PATH ${PATH}: 追加したいディレクトリ とする.
7.2.3 補完,履歴,別名
tcshには補完,履歴(ヒストリー),別名(エイリアス)という便利な機能がある.この項では,その使い方 を説明しよう.
37Emacsを用いて中身を表示しても良いが,.tcshrcを不用意に編集してしまうと,最悪の場合ログインできなくなるなど不具合が生じ
る可能性があるので,慎重に閲覧すること.
すでに説明したように,コマンドプロンプトに入力中に,途中まで入力して −−→− −→ キーを打つと,残りの部分 を推測してくれる機能がある.これが補完である.補完の候補が一意の場合には,それが入力され,そうでない 場合はもう一度 −−→− −→ キーを押すと候補の一覧が表示される.
シェルに入力したコマンドは,その履歴が記憶されている.historyコマンドによって,記憶されているコマ ンドのリストが表示される.以前入力した,長いコマンドをもう一度入力するのは大変面倒だが,この機能を上 手に使えば,入力の手間を劇的に減らすことができる.例えば,図2のようなことができる.さらに,コマンド ライン(プロンプトのある行)内での編集機能を使って,入力コマンドの編集を行えば,より強力な入力支援と なる. Ctrl p, Ctrl n, Ctrl a, Ctrl e, Ctrl f, Ctrl b, Ctrl k, Ctrl yなどのキーが使えるので,それぞれの 動作を確かめよ.
¶ ³
% ls
% cat .signature
←ここで Ctrl pと押してみる Ctrl p と押すごとに
% cat .signature
% ls
のように,以前入力したコマンドが順に表示される. Ctrl nで逆順に戻れる 入力したいコマンドを見つけたら Enter を押せば実行される
% history
←とすると以前入力したコマンドの一覧が表示される.
% !番号
←とするとヒストリーの番号に対応するコマンドが実行される.
% !l
←とするとlで始まるコマンドで,直近に実行されたコマンドが実行される.
µ ´
図2: シェルの履歴(ヒストリー)機能
次にエイリアスとは,入力の長いコマンドなどに別名をつける機能である.通常,.tcshrc の中などで設定す る38..tcshrcの中に
alias ls ’ls -F’
のような行があるが,これによって,コマンドラインでlsと入力することで,実際には,ls -F が実行される ようになる.
課題 7.2 図2の操作を実際に行ってみよ.
課題 7.3 .my-tcshrcの中で,以下のコマンドに別名を付け,それらの動作を確認せよ..my-tcshrcを編集後は,
source .my-tcshrc
として,変更をシェルに認識させる必要があることに注意せよ.
• alias にaという別名を付ける.
• history にhという別名を付ける.
• source にrunという別名を付ける.
• emacs -e mewに mewという別名を付ける.
• ps -u UID | grep -v grep | grep \!ˆ$にpsnという別名を付ける.
ここで,UIDとあるところには自分のログイン名を入れよ.
38我々の場合,.my-tcshrcの中で設定してもよい.
\!ˆ$という記号列は,このエイリアスpsnを実行したときの引数が実行時に代入される.使用例は,
% psn netscape
のようなものである.psについては,下記プロセスの項を参照せよ.
• dvips -f \!:1 | lpr -P\!:2にprintdviという別名を付ける.
実行時に,\!:1,\!:2にはそれぞれ,1番目,2番目の引数が代入される.
使用例は,
% printdvi hoge.dvi プリンター名
dviファイルをプリントするためのコマンドになる.
課題 7.4 シェルのコマンドラインでの編集機能について, Ctrl p, Ctrl n, Ctrl a, Ctrl e, Ctrl f, Ctrl b, Ctrl
k, Ctrl y, Ctrl dがそれぞれどのような機能を持っているか確かめ,それを下の例にならって表にしてkeys.txt というファイルに保存せよ.
例. C-は Ctrl を表すとする.
キー 機能
C-p 一つ前に入力したコマンドを表示 C-n 一つ後に入力したコマンドを表示 C-a 行の先頭へカーソルを移動 C-e
C-f C-b C-k C-y C-d
7.2.4 プロセス
UNIXはマルチタスクOSである.つまり,各ユーザが,(見かけ上)同時に複数の命令を実行することができ る.ls, tcsh, netscape, emacsなど,ひとつひとつのコマンドによって,ひとつ(または複数の) プロセス が発生する.OSはひとつの命令を,ひとつのプロセスを単位として扱っていると思えばいいだろう.現在計算機 上で動いているプロセスを表示させるにはpsというコマンドを使う.以下のコマンドを順次実行してみよ.UID とあるところには,自分のログイン名を入れよ.
¶ ³
% ps
% ps -f
% ps -u UID
% ps -A
% ps -Af
µ ´
1つ目の結果は,psを実行したのと同じktermから発行されたプロセスが表示される.2つ目は,1つ目と同様 だが,出力形式が詳しいものとなる.3つ目はUIDというユーザが発行した全てのプロセスが表示される.4つ 目は現在動いている全てのプロセスが実行される.5つ目は,4つ目と同様だが,出力形式が詳しいものとなる.
例えば,2つ目の出力結果は以下のようなものであろう:
UID PID PPID C STIME TTY TIME CMD s-suzuki 28614 27696 0 18:55:36 pts/9 0:00 ps -f s-suzuki 27893 27696 0 18:09:54 pts/9 0:03 emacs s-suzuki 27696 27692 0 17:52:12 pts/9 0:01 -tcsh
ここで,UIDはそのプロセスを実行したユーザー,PIDはプロセスIDと呼ばれるプロセスを指定するための番 号,PPIDはそのプロセスの元になった親プロセスのプロセスID,CMDはそのプロセスに対応するコマンドで ある.より詳しいことは,manなどで調べよ.
課題 7.5 現在自分の実行している全てのプロセスのリストをprocess.txtというファイルに保存せよ.(ヒント:
psコマンドとリダイレクト)
ここで,実行中のアプリケーションがハングアップしたり,コマンドなどが無限ループに陥るなど,不具合が 生じた場合の対処方法を説明しよう.このようなことが生じた際には,そのアプリケーションやコマンドに対応 するプロセスを殺してしまえばよい.そのためのコマンドがkill である.使用例として,netscapeを立ち上げ て,そのプロセスIDを調べ,それをkillによって殺すという一連の作業を記そう.
¶ ³
% netscape &
% ps -u UID | grep netscape
% kill PID
µ ´
ここで,UIDには自分のログイン名を入れる.PIDとあるところには,psの出力結果を見て,netscapeに対応 するPIDを入れる39.ただし,netscapeは複数のプロセスからなっているので,番号の大きい順にスペースで 区切って全てのPIDを並べる.つまり,例えばpsの出力結果が,
PID TTY TIME CMD 28964 pts/8 0:00 netscape 28984 pts/8 0:00 run-mozi 28990 pts/8 0:09 netscape 29037 pts/8 0:00 ps 28693 pts/8 0:00 tcsh
であれば,
% kill 28990 28984 28964
のようにする.場合によっては,これではプロセスを殺せないことがある.そういう場合には,kill にオプショ ンをつけて
¶ ³
% kill -9 PID
µ ´
のようにする.
課題 7.6 実際にnetscapeを立ち上げ,そのプロセスをkillすることによってnetscapeを終了させてみよ.
7.2.5 ジョブ
ここで,パイプとリダイレクトについて思い出そう.これは複数のコマンドを組み合わせて複雑な処理を行う ための,シェルの機能である.例えば,
¶ ³
% finger | grep -v ログイン名 | sort > hoge.txt
µ ´
のようなことが行えた.ここで,finger, grep, sortのひとつひとつのコマンドに対応して,プロセスがひと つずつ発生することになる.このような,ひとつ以上のプロセスからなる命令の組み合わせをジョブという.
先に説明したように,UNIXはマルチタスクOSであるので,(見かけ上)複数のジョブを同時に実行すること ができる.これら複数の命令を管理するための,tcshの仕組みをジョブ管理という.
ジョブには,命令を実行すると,その処理が終了するまで次の命令を実行できない,フォアグラウンドジョブ と,処理の終了を待たずに,次の命令を実行できるバックグラウンドジョブとがある.
ジョブ管理を行うための主なコマンドとして,jobs, fg, bg, killがある.jobsは現在実行中のジョブの一 覧を表示する.フォアグラウンドジョブとして実行した命令の途中で Ctrl zと入力すると,そのジョブを一時 停止することができる.fgは停止中のジョブをフォアグラウンドジョブとして再開するコマンドであり,bgは停
39psとgrepを組み合わせて使う代わりに,先に設定したエイリアスpsnを用いてもよい.
止中のジョブをバックグラウンドジョブとして再開するコマンドである.kill は実行中のジョブを終了させるコ マンドである.また,バックグラウンドジョブとして,命令を実行するためには,コマンドの最後に&を付けて 実行すればよい.さらにフォアグラウンドで実行中のジョブを強制終了するには, Ctrl cと入力すればよい.
詳細は,「手引き」UNIX編の第5章を参照せよ.
以下,使い方の例を見てみよう.
¶ ³
% netscape &
netscapeをバックグラウンドで実行
% emacs
Emacs上で Ctrl zと入力
Emacsが一時停止になる
% fg
Emacsがフォアグラウンドジョブとして再開
Emacs上で Ctrl zと入力
Emacsが一時停止になる
% bg
Emacsがバックグラウンドジョブとして再開
% kterm &
ktermをバックグラウンドで実行
% jobs
ジョブの一覧が表示される
% kill %ジョブ番号
ジョブ番号のジョブが停止される
µ ´
課題 7.7 上記の使い方の例を実際に入力してみよ.
課題 7.8 バックグラウンドジョブとフォアグラウンドジョブの違いの説明をans7.txtに書き加えよ.
7.3 Emacs 上でシェルを使う
Emacsの中でシェルを実行する方法がある.Emacs起動後M-x shell Enter とするか,以下のようにすれば実 行できる.
¶ ³
% emacs -e shell
µ ´
また,コマンドラインで,exitとすればシェルが終了する.
Emacsの中でシェルを使うことで,出力結果をEmacsの編集機能を用いて編集し,ファイルとして保存するこ
とができる.
課題7.9 Emacs上のシェルで,ps, finger, lsを実行し,出力をfinger.txtというファイルに保存せよ.
課題7.10 fingerコマンドの出力結果の意味をmanを用いて調べよ.
7.4 Emacs の設定
Emacsの設定は,.emacsで行う.ここでは,総合情報システム部の標準設定に加えて,いくつかの設定を行う
ために,.emacs-add.elというファイルを用意した.なお,これらのファイルでは,;以下の文はコメントである.
less を用いて,.emacs, .emacs-add.elの中身を閲覧してみよ.
(load "/usr/local/sut/rc/sut.emacs")
の部分で,標準設定を読み込み,
(load "~ /.emacs-add")
で,.emacs-add.elの設定を読み込んでいる.
.emacs-add.elの中では,バックアップファイルの自動作成をオンにする設定,mewで送信メールの自動バッ
クアップを Backupというメールフォルダ40に取るようにする設定,TEXの入力支援プログラム yatex (野鳥)
のための設定などを行っている.
課題 7.11 自分自身にメールを送り,そのバックアップが保存されていることを確認せよ.
7.5 困ったときには
ソフトなどがハングアップしたとき,困ったときの処理をいくつかまとめておこう.
1. 一般的な対処法:
ハングアップしたコマンドのPIDをpsによって探し,それをkillする.
2. フォアグラウンドジョブの場合:
Ctrl cを押してみる.
3. Emacsでの対処法:
(a) 何か変なことが起こったら
Ctrl g を押してみる.
(b) M-x undo として,ひとつ前の状態にもどしてみる.
(c) 編集したものが消えてしまった?
Ctrl yを押してみる.
(d) Ctrl x Ctrl wでとりあえず別名で保存し,古い元のファイルを Ctrl x Ctrl fで読み込みなおす.
7.6 本日の課題
課題7.12 (提出課題) 以下のファイルを添付して, s-suzuki宛に署名をつけて送信せよ.ただし,Subjectは「学
籍番号+Nov17」とせよ.また,メールの本文に添付したファイルの名前を明記すること.これらの指定が守られ
ていない場合, 減点対象となる.
なお,1,2,3,4は必須問題,5 は余裕のあるもののみ提出せよ.
1. ans7.txt 課題7.1,7.8の結果.
2. .my-tcshrc(エイリアスが設定されているもの) 課題7.3の結果.
3. keys.txt 課題7.4の結果.
4. process.txt 課題7.5の結果.
5. finger.txt 課題7.9の結果.
7.7 次回のテーマ
シェルスクリプト.
40˜ /Mail/Backupというディレクトリ