配付資料

計算機科学概論 シェル (2014 年 10 月 17 日)
山本 光晴
1
注意
教科書ではbash(Bourne-Again Shell) を題材として対話型シェルの説明をしているが、この演習ではこれまで我々
が使用してきたcsh(C Shell) やtcshについて説明する。演習中の説明をよく聞くこと。なお、シェルスクリプト (次
回) に関しては教科書と同様、sh(Bourne Shell) を使用する。
2
シェルとは
• シェル . . . UNIX におけるコマンドインタプリタ。
ユーザからの入力 (指令) を受け取り、コマンドの実行を行う。
• シェルも一つのプログラム。
シェルからシェルを起動することもできる。自分でシェルを作ることもできる。
• 例えばどんなことをやっている?
プロンプト (例: %) を表示する。
空白をコマンドや引数の区切りと扱う。
「>」や「<」をリダイレクションの指示と解釈する。
3
「~」をホームディレクトリと解釈する。
「% !p」でpで始まる最近のコマンドを実行する。
「% !!」で一つ前のコマンドを実行する。
コマンドの実行
• % コマンド名 引数 1 . . . 引数 n
コマンド名と引数の間、引数と引数の間は空白で区切る。
シェルはコマンドが終了するまで待つ (フォアグラウンドジョブ)。
• % コマンド 1 ; コマンド 2 ; . . . ; コマンド n
コマンド 1 . . . コマンド n を順に実行する。
• % コマンド &
シェルはコマンドが終了するまで待たない (バックグラウンドジョブ)。
• % コマンド 1 & コマンド 2 & . . . & コマンド n &
4
ジョブ制御 (教科書 p.95)
% /Network/Applications/Emacs.app/Contents/MacOS/Emacs
emacsを起動。 (「&」を付けるのを忘れた !!)
^Z
emacsを一旦停止させる (サスペンド)。
% bg
バックグラウンドジョブへ。
% fg %1 フォアグラウンドジョブへ。
fgやbgの対象を指定したいときは、「% fg % ジョブ番号」や「% bg % ジョブ番号」とする。ジョブ番号は「% コ
マンド &」や「% bg」の後に表示される。「% jobs」でジョブ一覧を表示。
5
標準入出力とリダイレクション・パイプ
リダイレクションやパイプの処理もシェルが行う。標準入出力とリダイレクション・パイプについては計算機演習
の資料http://www.math.s.chiba-u.ac.jp/~mituharu/lecture/cp1/14/slide-0630.pdf で復習せよ。
6
シェル変数
• 「% set 変数名 = 値」 . . . 変数に値を代入
• 「% set」 . . . 変数一覧
• 「% unset 変数名」 . . . 変数を消去
コマンド中の「$ 変数名」は変数に格納されている値に置き換えられる。
% set foo=abcd
% echo $foo
% echo $foo$foo > $foo
% cat abcd
% unset foo
% echo $foo
4
特殊な変数
シェルの動きに影響を与える変数の例:
prompt
プロンプト文字列。
path
コマンドの検索パス。
コマンド名に「/」が含まれない場合、この中のパスを順に検索する (cf. which コマンド)。
ignoreeof セットされていると、プロンプトの直後で^D をタイプしてもシェルを終了しない。
通常、シェルの初期設定ファイル (~/.cshrc や~/.login) の中に記述しておく。
環境変数
%
%
%
%
setenv 変数名 値
setenv
printenv 変数名
unsetenv 変数名
シェルから実行されるプログラムにも情報が伝えられ、プログラムの実行に影響を与える。
% setenv PAGER cat; man ls
% unsetenv PAGER;
man ls
通常、環境変数の設定も初期設定ファイルの中に記述しておく。
7
ファイル名置換
入力中に以下の部分があると、それはファイル名を表すパターンとみなされ、そのパターンがマッチするファイル
名の列をアルファベット順 (実際には文字コードから派生する辞書式順序) にソートしたものに展開される。
*
任意の文字列にマッチ。ただしファイル名の先頭の「.」にはマッチしない。
?
任意の 1 文字にマッチ。ただしファイル名の先頭の「.」にはマッチしない。
[. . . ] 「. . . 」中の文字のいずれかにマッチ。[0123cdef] のかわりに[0-3c-f] とも書ける。
以下の置換はその名前のファイルが存在しなくても起こる。
~
ユーザのホームディレクトリ。ただし先頭にない場合は置換されない。
~ログイン名
ログイン名で指定されるユーザのホームディレクトリ。ただし先頭にない場合は置換されない。
{○,. . . , ○} 分配法則。ソートはしない。
% echo *.p
% ls -l [a-z]*/mondai*
% echo .*
8
% ls ~/*~
% echo a{b,c{z,x}}
% mv foo{,.bak}
脱出文字とクオート
「<」や「$」や「*」に特殊な意味を持たせないようにするには?
• 直前に脱出文字 (Escape Character) 「\」を付ける。
• クオート (「’」や「"」) で括る。
% echo \* \< \\
% echo a b a\ \ b
% echo ’* < \’
9
% echo "a b" a" "b
% echo ’$HOME’ "$HOME"
% echo ’"’ "’" \" \’
補足
演習中ではリダイレクションは
コマンド < ファイル名
や
コマンド > ファイル名
の形であると説明した (し、教科書にもそう書いてある) が、実際には上の形に限られるわけでない。以下の例を実行
後、ファイルtest1∼test4の内容を確かめ、シェルがリダイレクションの指示をどのように解析しているのか考え
てみよ。
% echo foo bar > test1
% echo foo > test2 bar
% echo > test3 foo bar
% > test4 echo foo bar
5