UNIXの操作/UNIXの応用/シェルの応用

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

4.4.1 シェルの機能

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


表 4.3: シェルの機能
機能 ページ
コマンド,ファイル名を補完する(補完機能) 4.4.2
ファイル名を効率的に入力できるようにする(置換機能) 4.4.3
コマンドを登録する(エイリアス機能) 4.4.4
複数のコマンドを結合して実行する(リダイレクション,パイプ) 3.1.4
すでに使ったコマンドラインを何度も利用できるようにする(ヒストリ機能) 4.4.5
コマンドラインの編集機能 4.4.6
ジョブ管理 4.4.7

4.4.2 補完機能

<TAB>を使った補完

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

  • 該当するものが1つしかないときには,その名前を補完する
  • 2つ以上の候補があるときには,すべての候補に共通な部分までを補完する
%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-<TAB>
% rm report-all _
%dv<C-d>
dvi2ps          dviselect 
% dv_

4.4.3 メタキャラクタ

文字候補を指定するメタキャラクタ [ ]

`[ ]'は文字候補を指定するメタキャラクタです.`[ ]'の中に文字を列挙すると,その中のものを当てはまる文字の候補として表せます.例えば,`[Bbq]'は,`B'か`b'か`q'のうちの1文字を表します.また`-'を用いて範囲を表せます.`[a-z]'は小文字アルファベット1文字,`[0-9]'は数字1文字を表します.なお,候補の文字列の前に`^'を用いると,`[ ]'の中に列挙されていない文字を表します.例えば`[^tex]'は,`t'か`e'か`x'以外の文字を表します.

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

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

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

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


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

メタキャラクタは,多くのファイルを同時に操作する際に便利ですが,一方では操作を間違えてしまった場合の影響も大きいので注意する必要があります.特にファイルを消去するような場合にはコマンドを実行する前によく確認してください.

4.4.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コマンドを用いる前に,登録する文字列がコマンドとして存在しないことを確認しておく必要があります.

エイリアスは,基本的に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>
% _


4.4.5 ヒストリ機能

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

ヒストリリスト

ユーザが入力したコマンドラインは,入力の順番と共に記憶されています.これを``ヒストリリスト''と呼びます.ヒストリリストを確認するには,historyコマンドを用います.ヒストリコマンドに引数として数字を指定すると,最後に実行されたコマンドから数字分だけヒストリを表示します.引数を省略した場合には,記憶しているすべてのヒストリを表示します.


%history [数字]<RET>

%ls <RET>
%cd <RET>
%pwd <RET>
%history <RET>
    1  15:34   ls
    2  15:34   cd 
    3  15:35   pwd
%history 2 <RET>
    1  15:34   ls
    2  15:34   cd 
% _

コマンドラインの再実行

ヒストリ機能を用いて,ユーザはコマンドラインを再実行できます.再実行の方法には表4.4に示す4種類があります.


表 4.4: コマンドラインの再実行法
書式 意味
!! 直前のコマンドラインの再実行
!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 s01000hf13450 Nov 18 10:40 history.ps
-rw-r--r--  1 s01000hf3402 Nov 22 09:35 report.tex
% _

4.4.6 コマンドラインの編集

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


表 4.5: コマンドライン編集時のキー操作
目的 キー 動作
カーソルの移動 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つ後のコマンドラインを呼び出す


4.4.7 ジョブ管理

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

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

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

%emacs <RET>
_

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

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

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

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

ジョブの状態を知る

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

%xclock & <RET>
%less /home/s01000hf/file3 & <RET>
<C-z>
^Z
Suspended
%xbiff & <RET>
%jobs<RET>
[1]  - Running                xclock
[2]  + Suspended              less /home/s01000hf/file3
[3]    Running                xbiff
% _

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

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


ジョブの操作

ジョブの操作には,表4.7のようなコマンドを用います.いずれも引数としてジョブ番号を指定します.ジョブ番号が省略された場合,killコマンド以外はcurrentジョブが対象となります.

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

強制終了とサスペンド

実行中のフォアグラウンドジョブを強制終了するには,C-cを押します.また,C-zを押すと,フォアグラウンドで実行されているジョブをサスペンド(一時中断)できます.さらに,サスペンドしたジョブはfgbg などのコマンドで復帰します.例えばバックグラウンドで起動するジョブを間違えてフォアグラウンドで起動してしまったときに,1度サスペンドをして bgコマンドを実行することで,バックグラウンドジョブに切り替えられます.次にその実行例を示します.

%xlock & <RET>
%xdvi report.dvi& <RET>
%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
% _

多数のジョブをサスペンドしたままにしておくと,ホストに大きな負荷がかかってしまうのでサスペンドは必要に応じて使用してください.

4.4.8 日本語の利用

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

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

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


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

次に実行例を示します.

%setenv LANG ja<RET>
% _

環境変数

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

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

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

%printenv DISPLAY<RET>
%setenv DISPLAY host00:0.0<RET>
%printenv DISPLAY<RET> 
host00:0.0
% _