next up previous contents
Next: 2.6 UNIXでのフロッピーディスクの利用 Up: 2. UNIXの基本操作 Previous: 2.4 コマンド



2.5 シェル

ユーザはシェルを使ってコンピュータに命令を与える.シェルはユーザの入力した文字列を解釈し,コマンドを実行する.また,コマンドの簡単な実行,同じ作業の繰り返し,複数のプログラムの管理など,さまざまな機能を提供する.

2.5.1 シェルの機能

ユーザはコマンドを入力することでコンピュータに命令を与えられる.シェルはコマンドラインを解釈してコマンドを実行し,実行結果を表示する.シェルはプロンプト(%)を表示してユーザのコマンド入力を待ち,入力されたコマンドを実行し終えると再びプロンプトを表示する.ユーザがプロンプトに対して入力するコマンド,オプション,引数をまとめて``コマンドライン''という.シェルは,コマンドラインを受けつけてコマンドを実行する.図2.11にコマンド処理の流れを示す.


図 2.11:コマンド処理の流れ
図 2.11:コマンド処理の流れ

シェルはユーザがコマンドラインを効率的に入力するためのユーザインタフェイスの役割を果たしている.シェルのユーザインタフェイス機能を表2.5に示す.


表 2.5: シェルの機能
機能 ページ
ファイル名を効率的に入力できるようにする(置換機能) 第1部 2.5.2
コマンド,ファイル名を補完する(補完機能) 第1部 2.5.3
コマンドを登録する(エイリアス機能) 第1部 2.5.4
複数のコマンドを結合して実行する(リダイレクション,パイプ) 第1部 2.5.5
すでに使ったコマンドラインを何度も利用できるようにする(ヒストリ機能) 第1部 2.5.6
コマンドラインの編集機能 第1部 2.5.7
ジョブ管理 第1部 2.5.8



2.5.2 置換機能

例えば,ファイル名に.logが含まれているファイルをすべて消去するような場合,置換機能を使うと効率的に行える.

シェルにはメタキャラクタ(ワイルドカード)を展開して,入力されたファイル名を置換する機能がある.メタキャラクタとは任意の文字列や任意の1文字を指定するための特殊な文字のことである.メタキャラクタを利用することによって,複数のファイルを効率的に操作できる.メタキャラクタについて次に説明する.

0文字以上の任意の文字列を表すメタキャラクタ -*-

アスタリスク``*''は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文字はアルファベットでも数字でもよいが,*と異なり,必ず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]は, texのうちの1文字を表す.``-''を用いて範囲でも表せる. [a-z]はアルファベット1文字,[0-9]は数字1文字を表す.なお,候補の文字列の前に``^''を用いると, [ ]の中に列挙されていない文字を表す.例えば[^tex]は, tex以外の文字を表す.

文字列候補を指定するメタキャラクタ -{ }-

[ ]の場合は1文字だったが, の中にカンマ(,)で区切って文字列を列挙すると,その文字列を候補として扱うことができる.例えば,aux,logは,auxlogのどちらかを表す.

ホームディレクトリを表すメタキャラクタ -~-

``~''は,ホームディレクトリを表す.``~ログイン名''とすると,そのログイン名を持つユーザのホームディレクトリを表すが,ログイン名を省略すると自分のホームディレクトリを表す.

メタキャラクタを用いたファイル名をつけるとそのファイルの操作が困難になるので,ファイル名にはメタキャラクタを用いないこと.


2.5.3 補完機能

<TAB>を使った補完

シェルには,コマンドやファイル名が長いときに,最後まで入力しなくても残りの部分を補完する機能がある.これを補完機能という.コマンドやファイル名を途中まで入力して,<TAB> を押すと次のように補完機能を利用できる.

% ls<RET>
report.tex      report-all
% rm re<TAB>
% rm report_
% rm report-<TAB>
% rm report-all _

C-dを使った補完機能

ファイル名やコマンドを途中まで入力したところで,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_


2.5.4 エイリアス機能

エイリアス機能を使うと,コマンドの別名(エイリアス)を登録できる.ユーザは頻繁に用いるコマンドやコマンドラインを登録することで,効率的な作業を行える.次にエイリアスの登録,確認,削除について説明する.


エイリアスの登録

エイリアスを登録するには,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コマンドを実行したシェルでのみ有効である.よって,exitlogoutなどのコマンドで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.5.5 入出力のリダイレクションとパイプ

通常,コマンドはキーボード(標準入力)から入力され,結果は画面(標準出力)に表示される.しかし,コマンドの実行結果を用いて次の処理をしたいようなときに,実行結果をファイルに出力できれば効率的に作業を行える.シェルはコマンドの入力や出力を切り替える機能をもっており,ここではリダイレクションとパイプの2種類について説明する.


リダイレクション

リダイレクションは,ファイルの内容を標準入力として使用したり,標準出力の内容をファイルに書き込むための機能である.リダイレクションを使うことによって,ファイルの内容をコマンドに入力したり,コマンドの実行結果をファイルに書き込める.リダイレクションには,``<''や``>>''を用いる.


パイプ


パイプは,ある1つのコマンドの標準出力を次のコマンドの標準入力として使用する際に用いる.

次の例では,ls -lの標準出力を次のlessコマンドの標準入力として用いている.このようにすることで,lsコマンドの出力が1画面以上の長さにわたる場合に,1画面ごとに止めて見られる.


% ls -l | less<RET>

パイプは2つ以上のコマンドをつなぎ合わせられる.なお,パイプの後に``&''をつけると,コマンドの標準出力だけでなく標準エラー出力も次のコマンドの入力として使える(表2.6).
% [コマンド1] | [コマンド2]<RET>



表 2.6: パイプの種類
記号 意味
| 標準出力のパイプ
|& 標準出力と標準エラー出力のパイプ


同じファイル名をコマンドの入力と出力先に指定してはいけない.同じファイル名を指定するとファイルの内容が失われてしまう.出力リダイレクトによる 新規ファイルの作成を防止するときには,あらかじめシェルで``set noclobber''と入力しておく.


2.5.6 ヒストリ機能


シェルは過去に実行したコマンドラインをヒストリとして記憶している.これをシェルのヒストリ機能という.ヒストリ機能を利用して過去に入力したコマンドを簡単に再実行できる.


ヒストリリスト


ユーザが入力したコマンドラインは,入力の順番と共に記憶されている.これをヒストリリストと呼ぶ.ヒストリリストを確認するには,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種類がある.



表 2.7: コマンドラインの再実行法
書式 意味
!! 直前のコマンドラインの再実行
!n n番目(ヒストリ番号)に実行したコマンドラインの再実行
!-n 最も大きいヒストリ番号からnをひいたヒストリ番号のコマンドラインの再実行
!str 指定された文字列( str)ではじまる1番最近に実行したコマンドラインの再実行


% 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
% _



2.5.7 コマンドラインの編集

コマンドラインは,入力してから<RET> を押すまでであれば内容を変更できる.コマンドラインを編集するには,表2.8のキー操作を利用する.


表 2.8: コマンドライン編集時のキー操作
目的 キー 動作
カーソルの移動 C-b カーソルを左に1つ動かす
  C-f カーソルを右に1つ動かす
  C-a コマンドラインの行頭に移動
  C-e コマンドラインの行末に移動
文字の削除 C-d カーソル上の1文字を削除
  C-h カーソルの左の1文字を削除
  C-k カーソルからコマンドラインの行末までを削除
  C-u コマンドライン全体を削除
ヒストリの呼び出し C-p 表示されているコマンドラインの
1つ前のコマンドラインを呼び出す
  C-n 表示されているコマンドラインの
1つ後のコマンドラインを呼び出す


2.5.8 ジョブ管理

基本的にシェルは1つのコマンドが実行されると,そのコマンドの終了を待ち続ける.その間,プロンプトは表示されないので次のコマンドの入力はできない.同じシェルで複数のコマンドを平行して処理するためには,あらかじめ,実行するコマンドに``&''をつけて実行する必要がある.``&''をつけて実行されたコマンドはバックグラウンドジョブと呼ばれ,コマンドの終了を待たずにプロンプトが表示される.


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

コマンド名を入力して<RET> を押すと,プロンプトはコマンドの処理が終わるまで表示されなくなる.このようにシェルと対話式に処理していくジョブを,``フォアグラウンドジョブ''という.次の例では,エディタであるEmacsを起動するコマンドを実行しているが,このEmacsはフォアグラウンドジョブで行っているため,Emacsを終了するまでプロンプトが表示されず,他のコマンドを実行できない.

% emacs<RET>
_

これに対して,コマンドの処理が終わるまで待たずにプロンプトを表示するような実行の仕方を,``バックグラウンドジョブ''という.コマンドをバックグラウンドジョブとして起動するには,コマンドの後に``&''をつけて実行する.

次の例では,バックグラウンドジョブでEmacsを起動しているため,Emacsを使いながら他のコマンドを実行できる.フォアグラウンドジョブとして実行できるジョブは1つだけだが,バックグラウンドジョブとして実行することで,複数のジョブを同時に実行できる.

% emacs &<RET>
[1] 15895
% _

フォアグラウンドジョブとバックグラウンドジョブには,いくつかの違いがある.フォアグラウンドジョブとバックグラウンドジョブの処理の結果の出力は,どちらも表示される.しかし,シェルから情報を入力できるのは,フォアグラウンドジョブのみである.ユーザがシェルから数値やファイル名などの情報を起動後に入力するようなジョブがバックグラウンドジョブとして実行されていた場合,そのジョブがフォアグラウンドになるまで処理が中断されてしまう.


ジョブの状態を知る -- jobs

シェルが現在実行しているジョブの情報を知るには,jobsコマンドを用いる.

% jobs<RET>
[1]  - Running                xclock
[2]  + Suspended              less /home/s00000hf/file3
[3]    Running                xbiff
% _

左端の[ ]の中の数字は,ジョブ番号といい,シェルがジョブを処理する際にジョブにつける番号である.ジョブを操作するコマンドは,すべてこのジョブ番号を指定して行う.その他の表示の意味を表2.9に示す.


表: jobsコマンドの出力
表示 意味
左端の[ ]内の数字 ジョブ番号
Running バックグラウンドジョブ
Suspended 一時停止中のジョブ
+ currentジョブ(フォアグラウンドで最後に実行されたジョブ)
- previousジョブ(currentジョブの前に実行されたジョブ)


ジョブの操作

ジョブの操作には,表2.10のようなコマンドを用いる.


表 2.10: ジョブ操作

コマンド 意味
fg バックグラウンドからフォアグラウンドへの切り替え
bg サスペンドしていたジョブをバックグラウンドで実行する
kill ジョブを終了する

いずれもジョブ番号を%の後に引数として実行する対象を指定する.ジョブ番号が省略された場合,killコマンド以外はcurrentジョブが対象となる.


強制終了とサスペンド

実行中のフォアグラウンドジョブを強制終了するには,C-cを押す.また,C-zを押すと,フォアグラウンドで実行されているジョブをサスペンド(一時中断)できる.さらに,サスペンドしたジョブはfgbg などのコマンドで復帰する.例えばバックグラウンドで起動するジョブを間違えてフォアグラウンドで起動してしまったときに,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
% _
多数のジョブをサスペンドしたままにしておくと,ホストに大きな負荷がかかってしまうのでサスペンドは必要に応じて使うこと.


2.5.9 日本語の利用

CNSのUNIX環境では,オンラインマニュアルやエラーメッセージなどは基本的に日本語で表示される.日本語で表示されない場合は,次のようにロケール値を設定する必要がある.

% setenv LANG [ロケール値]<RET>

2.11にホストごとのロケール値の設定を示す.


表 2.11: 日本語LANG環境の設定
ホスト名 ロケール値
z???, zz???, u???, ccz?? ja
otwo?? ja_JP

作業が終了したら,次の例のようにロケール値をもとに戻すこと.ロケール値を変更したままだと正しく表示されなくなってしまう場合がある.

% setenv LANG ja<RET>
% _

2.5.10 スクリプトと変数


スクリプト

シェルはユーザが入力したコマンドラインを対話的に処理するだけでなく,あらかじめ処理の内容をファイルに書いておき,一連の作業として実行できる.処理の内容を記述したものをスクリプトと呼び,その内容を書いておくファイルをスクリプトファイルという.

シェルスクリプトでは条件分岐や繰り返しなどの処理ができる.このため同じ処理を何度も繰り返す場合や,コマンドラインからでは難しい複雑な処理も,スクリプトを書くことによって容易に行える.シェルスクリプトの例を次に示す.

#!/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
% _

シェルの種類

シェルには,CNSで用いられているtcshコマンド以外にも, shコマンドやbashコマンド, cshコマンドなどがあり,それぞれが特徴を持つ. cshコマンド,tcshC言語言語を意識した文法を持つ.また,shコマンドはシェルスクリプトの作成に利用できる.

シェル変数

ユーザは,シェル変数と呼ばれる変数を利用することによって,シェルやコマンドの動作を操作できる.シェル変数は,基本的にプログラミング言語の変数と同じで,自由に設定できる.設定には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
  
% _
シェルにはユーザが設定した変数以外にも,あらかじめ用意されている``定義済みシェル変数''がある.これはシェルの実行環境を規定している.定義済みシェル変数を変更することによって,ユーザのシェル環境を自由に変えられる.定義済みシェル変数のうちの一部を,表2.12に示す.


表 2.12: 代表的な定義済みシェル変数
変数 意味
fignore この変数で参照する文字列を持つファイル名は,シェルの補完機能で補完する候補の対象から外す
history コマンド履歴機能を有効にし,参照される値のコマンドラインを記憶する
ignoreeof 設定すると C-dを押してもログアウトしない
path ファイルシステム中に遍在するコマンドを探すディレクトリを指定する
prompt プロンプトの形式を指定する

次に定義済みシェル変数の変更例を示す.

$pathをパスの前に書き忘れるとCNSで標準設定されているパスが上書きされてしまい,通常利用できるコマンドが利用できなくなってしまうので,注意すること.


環境変数

ユーザは,環境変数と呼ばれる変数を利用することによって,シェルやコマンドの動作を操作できる.現在設定されている環境変数の一覧を表示するには,printenvコマンドを用いる.printenvコマンドの後に引数として環境変数名を指定すると,その変数だけが表示される.また,変数の前に$をつけてechoコマンドでも表示できる. 環境変数を設定するには,setenvコマンドを用いる.環境変数はコマンドの実行環境を規定し,起動したコマンドにも引き継がれる.

% printenv [環境変数名]<RET>
% setenv [環境変数名] [値]<RET>

アプリケーションの中には環境変数に指定された値によって動作を変えるものがある.次に例を示す.


next up previous contents
Next: 2.6 UNIXでのフロッピーディスクの利用 Up: 2. UNIXの基本操作 Previous: 2.4 コマンド