ユーザはシェルを使ってコンピュータに命令を与える.シェルはユーザの入力した文字列を解釈し,コマンドを実行する.また,コマンドの簡単な実行,同じ作業の繰り返し,複数のプログラムの管理など,さまざまな機能を提供する.
ユーザはコマンドを入力することでコンピュータに命令を与えられる.シェルはコマンドラインを解釈してコマンドを実行し,実行結果を表示する.シェルはプロンプト(%
)を表示してユーザのコマンド入力を待ち,入力されたコマンドを実行し終えると再びプロンプトを表示する.ユーザがプロンプトに対して入力するコマンド,オプション,引数をまとめて``コマンドライン''という.シェルは,コマンドラインを受けつけてコマンドを実行する.図2.11にコマンド処理の流れを示す.
シェルはユーザがコマンドラインを効率的に入力するためのユーザインタフェイスの役割を果たしている.シェルのユーザインタフェイス機能を表2.5に示す.
例えば,ファイル名に.logが含まれているファイルをすべて消去するような場合,置換機能を使うと効率的に行える.
シェルにはメタキャラクタ(ワイルドカード)を展開して,入力されたファイル名を置換する機能がある.メタキャラクタとは任意の文字列や任意の1文字を指定するための特殊な文字のことである.メタキャラクタを利用することによって,複数のファイルを効率的に操作できる.メタキャラクタについて次に説明する.
アスタリスク``*
''は0文字以上の任意の文字列を表すメタキャラクタである.例えば,*.tex
はファイル名が.texで終わるすべてのファイルを意味する.その際,シェルは*
を0文字の文字列としても解釈するので,例えばabc*
と入力すると,abcという名前のファイルも操作の対象に含まれる.ただし,*
が先頭で用いられた場合には,ファイル名が``.
''ではじまるファイルは含まれない.
% ls -a<RET> ./ .mathmatics economics.tex micro.c ../ .statistics macro.tex micro.tex % ls *.tex<RET> economics.tex macro.tex micro.tex % ls m*<RET> macro.tex micro.c micro.tex % rm *<RET> % ls -a<RET> ./ ../ .mathmatics .statistics % _
クエスチョンマーク(?
)は任意の1文字を表すメタキャラクタである.この1文字はアルファベットでも数字でもよいが,*
と異なり,必ず1文字存在していなければならない.例えば,m?cro.tex
という指定には,
mcro.texは含まれない.
% ls<RET> economics.tex macro.tex micro.c micro.tex mcro.tex % ls m?cro.tex<RET> macro.tex micro.tex % _
[ ]
は文字候補を指定するメタキャラクタである.
[ ]
の中に文字を列挙すると,その中のものを当てはまる文字の候補として表せる.例えば,[tex]
は,
tかeかxのうちの1文字を表す.``-''を用いて範囲でも表せる.
[a-z]
はアルファベット1文字,[0-9]
は数字1文字を表す.なお,候補の文字列の前に``^
''を用いると,
[ ]
の中に列挙されていない文字を表す.例えば[^tex]
は,
tかeかx以外の文字を表す.
[ ]
の場合は1文字だったが,
の中にカンマ(,
)で区切って文字列を列挙すると,その文字列を候補として扱うことができる.例えば,aux,log
は,auxかlogのどちらかを表す.
``~
''は,ホームディレクトリを表す.``~
ログイン名''とすると,そのログイン名を持つユーザのホームディレクトリを表すが,ログイン名を省略すると自分のホームディレクトリを表す.
シェルには,コマンドやファイル名が長いときに,最後まで入力しなくても残りの部分を補完する機能がある.これを補完機能という.コマンドやファイル名を途中まで入力して,<TAB> を押すと次のように補完機能を利用できる.
% ls<RET> report.tex report-all % rm re<TAB> % rm report_ % rm report-<TAB> % rm report-all _
ファイル名やコマンドを途中まで入力したところで,C-dを押すと,そこまで入力した内容に該当するコマンドやファイルが表示される.
% ls<RET> report.tex report-all % rm re<C-d> report.tex report-all % rm re_ % rm report-<C-d> report-all % dv<C-d> dvi2ps dviselect % dv_
エイリアス機能を使うと,コマンドの別名(エイリアス)を登録できる.ユーザは頻繁に用いるコマンドやコマンドラインを登録することで,効率的な作業を行える.次にエイリアスの登録,確認,削除について説明する.
エイリアスを登録するには,aliasコマンドを用いる.エイリアスには,コマンドだけでなくオプションや引数を含めた指定が可能なので,自分がそのコマンドを使う際に必ず指定するオプションなどが決まっている場合には,それらもまとめて登録できる.
% alias [別名] [エイリアスをつけたいコマンドライン]<RET>
次の実行例では,ls -Fというコマンドラインをdirというエイリアス(別名)で登録している.
% ls -F<RET> dir1/ file1 linkfile@ % dir<RET> dir: Command not found. % alias dir ls -F<RET> % dir<RET> dir1/ file1 linkfile@ % _
エイリアス機能を使って,初めからコマンドとして存在する文字列をエイリアスに指定してしまうと,初めから存在するコマンドを使用できなくなってしまう.そこで,aliasコマンドを用いる前に,登録する文字列がコマンドとして存在しないことを確認しておく必要がある.コマンドの存在を確認するにはwhichコマンドを用いる.whichコマンドを実行して,``Command not found.''と表示されたら,その文字列はコマンドとして存在しないので,エイリアスとして使用できる.
エイリアスは,基本的にaliasコマンドを実行したシェルでのみ有効である.よって,exitやlogoutなどのコマンドで1度そのシェルを閉じてしまうと,登録したエイリアスは失われてしまう.そこで,毎回同じエイリアスを利用する場合には,ホームディレクトリにある.cshrcという設定ファイルに aliasコマンドを書き込む..cshrcファイルに aliasコマンドを書き込むと,起動されるシェルすべてにそのエイリアスを適用できる.
現在登録されているエイリアスの一覧を見るには,aliasコマンドを引数なしで実行する.すると,左側に登録されている別名,右側に実際に実行されるコマンドラインを並べたリストが表示される.このときaliasコマンドの引数として,登録した別名だけを指定するとその別名の実際のコマンドラインが表示される.
% alias<RET> dir ls -F rl rlogin localhost -l % alias dir<RET> ls -F % _
1度登録したエイリアスを解除するには,unaliasコマンドを用いる.
% which dir<RET> dir: aliased to ls -F % dir<RET> file1 other@ report/ % unalias dir<RET> % dir<RET> dir: Command not found. % _
エイリアスをいくつも指定していると,エイリアスで設定した内容を再びエイリアスに指定してしまうことがある.このときには,``Alias loop.''と表示され,そのコマンドを実行できなくなる.また,すでに存在するコマンドと同じ名前をエイリアスに設定すると,そのコマンドが実行できなくなる.このような際には,aliasコマンドで重複しているエイリアスを確認し, unaliasコマンドで解除する.次に例を示す.
% cat file.tex<RET> Alias loop. % alias<RET> cat more more cat % unalias cat<RET> % _
通常,コマンドはキーボード(標準入力)から入力され,結果は画面(標準出力)に表示される.しかし,コマンドの実行結果を用いて次の処理をしたいようなときに,実行結果をファイルに出力できれば効率的に作業を行える.シェルはコマンドの入力や出力を切り替える機能をもっており,ここではリダイレクションとパイプの2種類について説明する.
リダイレクションは,ファイルの内容を標準入力として使用したり,標準出力の内容をファイルに書き込むための機能である.リダイレクションを使うことによって,ファイルの内容をコマンドに入力したり,コマンドの実行結果をファイルに書き込める.リダイレクションには,``<
''や``>>
''を用いる.
ファイルからデータを読み込んでコマンドに実行させるには,``<
''を用いる.``<
''の左側に実行するコマンドを,右側にコマンドに入力する内容を書いたファイルの名前を指定する.
% [実行するコマンド] < [ファイル名]<RET>
コマンドの結果をファイルに出力するには``>
''を用いる.``>
''を用いたリダイレクションには次の3つの書式がある.
% [コマンド] > [出力するファイル名]<RET> % [コマンド] >> [出力するファイル名]<RET> % [コマンド] >& [出力するファイル名]<RET>
1つめはコマンドの処理結果をファイルに上書きする.そのため,同じ名前のファイル名が存在する場合には,以前の内容は消去されてしまう.それに対して,2つめはコマンドの処理結果を指定したファイルの末尾に書き加える.3つめの``>&
''はコマンドの標準出力に加えて,標準エラー出力をファイルに上書きする.これはコンパイル時のエラーなどをファイルに出力する場合などに用いる.次の例では,lsコマンドの出力結果をdirectoryというファイルに書き込んでいる.なお``>
''を用いた場合,コマンドの実行結果は表示されない.
% ls<RET> report.tex proposal.gif % ls > directory<RET> % more directory<RET> report.tex proposal.gif % _
パイプは,ある1つのコマンドの標準出力を次のコマンドの標準入力として使用する際に用いる.
次の例では,ls -lの標準出力を次のlessコマンドの標準入力として用いている.このようにすることで,lsコマンドの出力が1画面以上の長さにわたる場合に,1画面ごとに止めて見られる.
% ls -l | less<RET>
&
''をつけると,コマンドの標準出力だけでなく標準エラー出力も次のコマンドの入力として使える(表2.6).
% [コマンド1] | [コマンド2]<RET>
シェルは過去に実行したコマンドラインをヒストリとして記憶している.これをシェルのヒストリ機能という.ヒストリ機能を利用して過去に入力したコマンドを簡単に再実行できる.
ユーザが入力したコマンドラインは,入力の順番と共に記憶されている.これをヒストリリストと呼ぶ.ヒストリリストを確認するには,historyコマンドを用いる.引数を指定すると,最後に実行されたコマンドから引数の数字の数だけヒストリを表示する.引数を省略した場合には,記憶しているすべてのヒストリを表示する.
% history [数字]<RET>
% history<RET> 1 15:34 cd report 2 15:34 ls 3 15:35 more micro 4 15:37 a2ps -p micro | lpr -Pnps2 5 16:12 history % history 3<RET> 4 15:37 a2ps -p micro | lpr -Pnps2 5 16:12 history 6 16:23 history 3 % _
ヒストリ機能を用いて,ユーザはコマンドラインを再実行できる.再実行の方法には表2.7に示す4種類がある.
|
% history 4<RET> 10 15:18 ls 11 15:29 more history.txt 12 15:29 a2ps history.txt | lpr -Pnps2 13 15:32 history % !more<RET> more history.txt % _
ヒストリ指定をしてコマンドを実行する前に,あらかじめコマンドラインの内容を確認できる.ヒストリ指定の直後に(スペースを空けずに) ``:p
''を入力すると,ヒストリリストから指定されたコマンドラインを表示する.そのままコマンドを実行する場合には,続けて``!!
''を入力する.次にヒストリ番号9のコマンドの内容を確認し,それを再実行する例を示す.
% !9:p<RET> ls -l % !!<RET> ls -l total 2 -rw-r--r-- 1 s00000hf13450 Nov 18 10:40 history.ps -rw-r--r-- 1 s00000hf3402 Nov 22 09:35 report.tex % _
コマンドラインは,入力してから<RET> を押すまでであれば内容を変更できる.コマンドラインを編集するには,表2.8のキー操作を利用する.
基本的にシェルは1つのコマンドが実行されると,そのコマンドの終了を待ち続ける.その間,プロンプトは表示されないので次のコマンドの入力はできない.同じシェルで複数のコマンドを平行して処理するためには,あらかじめ,実行するコマンドに``&
''をつけて実行する必要がある.``&
''をつけて実行されたコマンドはバックグラウンドジョブと呼ばれ,コマンドの終了を待たずにプロンプトが表示される.
コマンド名を入力して<RET> を押すと,プロンプトはコマンドの処理が終わるまで表示されなくなる.このようにシェルと対話式に処理していくジョブを,``フォアグラウンドジョブ''という.次の例では,エディタであるEmacsを起動するコマンドを実行しているが,このEmacsはフォアグラウンドジョブで行っているため,Emacsを終了するまでプロンプトが表示されず,他のコマンドを実行できない.
% emacs<RET>
_
これに対して,コマンドの処理が終わるまで待たずにプロンプトを表示するような実行の仕方を,``バックグラウンドジョブ''という.コマンドをバックグラウンドジョブとして起動するには,コマンドの後に``&
''をつけて実行する.
次の例では,バックグラウンドジョブでEmacsを起動しているため,Emacsを使いながら他のコマンドを実行できる.フォアグラウンドジョブとして実行できるジョブは1つだけだが,バックグラウンドジョブとして実行することで,複数のジョブを同時に実行できる.
% emacs &<RET>
[1] 15895
% _
フォアグラウンドジョブとバックグラウンドジョブには,いくつかの違いがある.フォアグラウンドジョブとバックグラウンドジョブの処理の結果の出力は,どちらも表示される.しかし,シェルから情報を入力できるのは,フォアグラウンドジョブのみである.ユーザがシェルから数値やファイル名などの情報を起動後に入力するようなジョブがバックグラウンドジョブとして実行されていた場合,そのジョブがフォアグラウンドになるまで処理が中断されてしまう.
シェルが現在実行しているジョブの情報を知るには,jobsコマンドを用いる.
% jobs<RET>
[1] - Running xclock
[2] + Suspended less /home/s00000hf/file3
[3] Running xbiff
% _
左端の[ ]
の中の数字は,ジョブ番号といい,シェルがジョブを処理する際にジョブにつける番号である.ジョブを操作するコマンドは,すべてこのジョブ番号を指定して行う.その他の表示の意味を表2.9に示す.
ジョブの操作には,表2.10のようなコマンドを用いる.
いずれもジョブ番号を%
の後に引数として実行する対象を指定する.ジョブ番号が省略された場合,killコマンド以外はcurrentジョブが対象となる.
実行中のフォアグラウンドジョブを強制終了するには,C-cを押す.また,C-zを押すと,フォアグラウンドで実行されているジョブをサスペンド(一時中断)できる.さらに,サスペンドしたジョブはfgやbg などのコマンドで復帰する.例えばバックグラウンドで起動するジョブを間違えてフォアグラウンドで起動してしまったときに,1度サスペンドをしてbgコマンドを実行することで,バックグラウンドジョブに切り替えられる.
% jobs<RET> [1] - Running xclock [2] + Running xdvi report.dvi % fg %1<RET> <C-z> ^Z Suspended % jobs<RET> [1] + Suspended xclock [2] - Running xdvi report.dvi % bg %1<RET> [1] Running xclock [2] + Running xdvi report.dvi % fg %2<RET> <C-c> ^C % jobs<RET> [1] Running xclock % _
CNSのUNIX環境では,オンラインマニュアルやエラーメッセージなどは基本的に日本語で表示される.日本語で表示されない場合は,次のようにロケール値を設定する必要がある.
% setenv LANG [ロケール値]<RET>
表2.11にホストごとのロケール値の設定を示す.
作業が終了したら,次の例のようにロケール値をもとに戻すこと.ロケール値を変更したままだと正しく表示されなくなってしまう場合がある.
% setenv LANG ja<RET>
% _
シェルはユーザが入力したコマンドラインを対話的に処理するだけでなく,あらかじめ処理の内容をファイルに書いておき,一連の作業として実行できる.処理の内容を記述したものをスクリプトと呼び,その内容を書いておくファイルをスクリプトファイルという.
シェルスクリプトでは条件分岐や繰り返しなどの処理ができる.このため同じ処理を何度も繰り返す場合や,コマンドラインからでは難しい複雑な処理も,スクリプトを書くことによって容易に行える.シェルスクリプトの例を次に示す.
#!/bin/sh -f echo "Hello." echo "Now.." date
先頭行が``#!
''ではじまると,それに続く絶対パス名でそのファイルを実行するコマンドを指定できる.この例では,実行するコマンドを
/bin/shに指定している.この他にも,tcshコマンドやperlコマンドなどを指定できる.先頭行以外が``#
''ではじまると,コメントとして無視される.
またこの例では``Hello.''と``Now..''をシェルに表示し(echoコマンド),その後,日時を表示する(dateコマンド)ように設定されている.シェルスクリプトの書き方についての詳細は市販のマニュアルなどを参照すること.
スクリプトファイルは,先頭行で実行するコマンドを指定して,かつそのファイルの保護モードが実行を許可していれば,コマンドとして実行できる.例として示したスクリプトが`now'という名前のファイルに書かれていた場合,次のような手順で`now'をコマンドとして実行できる.
% ls -F<RET> now % chmod u+x now<RET> % ls -F<RET> now* % now<RET> Hello. Now.. Fri Feb 18 11:28:49 JST 2000 % _
ユーザは,シェル変数と呼ばれる変数を利用することによって,シェルやコマンドの動作を操作できる.シェル変数は,基本的にプログラミング言語の変数と同じで,自由に設定できる.設定にはsetコマンドを用いる.また,1度設定したシェル変数を無効にするには, unsetコマンドを用いる.シェル変数はシェルから起動したコマンドには引き継がれない.
% set [変数名] = 設定値<RET> % unset [変数名]<RET>
% set history = 300<RET> % echo $history<RET> 300 % unset history<RET> % echo $history<RET> history: Undefined variable. % _
また,現在設定されているシェル変数の一覧を確認するには,setコマンドを引数なしで実行する.設定した値を参照するには`$
変数名'とする.
% set<RET>
addsuffix
argv ()
cwd /home/t00000tf/
echo_style bsd
edit
gid 100
history 100
home /home/t00000tf
% _
|
次に定義済みシェル変数の変更例を示す.
例えば次のように設定すると,ホームディレクトリの下にあるmydirディレクトリにある実行ファイルを,ファイル名だけでコマンドとして呼び出せるようになる.
% helloworld<RET> helloworld: Command not found. % ~/mydir/test<RET> Hello world. % set path = ($path ~/mydir)<RET> % test<RET> %Hello world. % _
$path
をパスの前に書き忘れるとCNSで標準設定されているパスが上書きされてしまい,通常利用できるコマンドが利用できなくなってしまうので,注意すること.
% set prompt = "%m:%c %"<RET>
ccz01:~/document %_
%m
と%c
を利用したが同様にプロンプトの設定において利用できる主な文字列を表2.13に示す.
|
ユーザは,環境変数と呼ばれる変数を利用することによって,シェルやコマンドの動作を操作できる.現在設定されている環境変数の一覧を表示するには,printenvコマンドを用いる.printenvコマンドの後に引数として環境変数名を指定すると,その変数だけが表示される.また,変数の前に$
をつけてechoコマンドでも表示できる.
環境変数を設定するには,setenvコマンドを用いる.環境変数はコマンドの実行環境を規定し,起動したコマンドにも引き継がれる.
% printenv [環境変数名]<RET> % setenv [環境変数名] [値]<RET>
アプリケーションの中には環境変数に指定された値によって動作を変えるものがある.次に例を示す.
なお,ディスプレイ名は通常,利用中のホストにシールで貼ってある名前に :0.0を加えたものである.次の例ではディスプレイをhost00:0.0 に指定している.
% printenv DISPLAY<RET> % setenv DISPLAY host00:0.0<RET> % printenv DISPLAY<RET> host00:0.0 % _
% setenv PAGER less<RET>
% _
Next: 2.6 UNIXでのフロッピーディスクの利用
Up: 2. UNIXの基本操作
Previous: 2.4 コマンド