SFC CNS GUIDE 2004

11.2 シェルの応用

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

11.2.1 シェルの機能

シェルはユーザがコマンドを効率的に入力するために ユーザとコンピュータを仲介する役割を果たしています. 表11.1にシェルの機能を示します.

表 11.1: シェルの機能
機能 説明 ページ
補完機能 コマンドやファイル名を補完する [*]
置換機能 ファイル名を効率的に入力できるようにする [*]
エイリアス機能 コマンドに対して別の名前を割り当てる [*]
リダイレクション,パイプ 複数のコマンドを結合して実行する [*]
ヒストリ機能 すでに使ったコマンドを何度も利用できるようにする [*]
コマンドの編集機能 Enterを押すまで内容変更ができる [*]
ジョブ管理 コマンド実行中は次のコマンド入力をできなくする [*]

11.2.2 補完機能

11.2.2.1 <TAB>を使った補完

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

% ls <ENTER>
report.tex      report-all
% rm re <TAB>
% rm report_
% rm report- <TAB>
% rm report-all_

11.2.2.2 C-dを使った補完機能

ファイル名やコマンドを途中まで入力したところで, C-dを押すと, そこまで入力した内容に該当するコマンドやファイルが表示されます.

% ls <ENTER>
report.tex      report-all 
% rm re <C-d>
report.tex      report-all
% rm re_
% rm report-<TAB>
% rm report-all_
% dv <C-d>
dvi2fax   dvicopy   dvilj     dvilj4    dvilj6   dvips    dviselect   dvitype
dvi2ps    dvihp     dvilj2p   dvilj4l   dvipdf   dvired   dvitomp
% dv_

11.2.3 エイリアス

同じコマンドを何度も実行する際に, そのコマンドに簡単な別名 (エイリアス) を 登録することによって作業の効率化をはかれます. 次にエイリアスの登録,確認,削除について説明します.

11.2.3.1 エイリアスの登録

エイリアスを登録するには, aliasコマンドを使用します. エイリアスには, コマンドそのものだけでなく コマンドにオプションや引数を指定して登録できるので, 自分がそのコマンドを使用する際に必ず指定するオプションなどが 決まっている場合には, それらもまとめて登録できます.

alias [別名] [エイリアスをつけたいコマンド]

次の実行例では,`ls -F' というコマンドを `dir' というエイリアスで登録しています.

% ls -F <ENTER>
dir1/           file1           linkfile@
% dir <ENTER>
dir: Command not found.
% alias dir ls -F <ENTER>
% dir <ENTER>
dir1/           file1           linkfile@
% _

aliasコマンドを利用する前に, 登録する文字列がコマンドとして存在しないことを確認しておく必要があります.

エイリアスは, 基本的にaliasコマンドを実行したシェルでのみ有効です. そのため, exitlogoutなどのコマンドで1度そのシェルを閉じてしまうと, 登録したエイリアスは失われてしまいます. そこで, 毎回同じエイリアスを利用する場合には, ホームディレクトリにある `.cshrc' という設定ファイルに aliasコマンドを書いておきます. `.cshrc' ファイルに aliasコマンドを書いておくと, その後に起動されるシェルすべてにそのエイリアスを適用できます.

11.2.3.2 エイリアスの確認

現在登録されているエイリアスの一覧を見るには, aliasコマンドを引数なしで実行します. すると, 左側に登録されている別名, 右側に実際に実行されるコマンドラインを並べたリストが表示されます. このときaliasコマンドの引数として, 登録した別名だけを指定するとその別名の実際のコマンドラインが表示されます.

% alias <ENTER>
dir     ls -F
rm      rm -i
% alias dir <ENTER>
ls -F
% _

11.2.3.3 エイリアスの解除

1度登録したエイリアスを解除するには, unaliasコマンドを利用します.

% which dir <ENTER>
dir:    aliased to ls -F
% dir <ENTER>
file1           other@          report/
% unalias dir <ENTER>
% dir <ENTER>
dir: Command not found.
% _

エイリアスをいくつも指定していると, エイリアスで設定した内容を再びエイリアスに指定してしまうことがあります. このときには,`Alias loop.' と表示され, そのコマンドを実行できなくなります. また, すでに存在するコマンドと同じ名前をエイリアスに設定すると, そのコマンドが実行できなくなります. このようなときには,aliasコマンドで重複しているエイリアスを確認し, unaliasコマンドで解除します.

% cat file.tex <ENTER>
Alias loop.
% alias <ENTER>
cat     more
more    cat
% unalias cat <ENTER>
% alias <ENTER>
more    cat
% cat file.tex <ENTER>
I can feel
    Something in the fall
       Nothing but blue sky
% _

11.2.4 ヒストリ機能

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

11.2.4.1 ヒストリリスト

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

history [数字]
% ls <ENTER>
% cd <ENTER>
% pwd <ENTER>
% history <ENTER>
    1  15:34   ls
    2  15:34   cd 
    3  15:35   pwd
% history 2 <ENTER>
    3  15:35   pwd
    4  15:35   history 2
% _

11.2.4.2 コマンドの再実行

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

表 11.2: コマンドの再実行法
書式 意味
!! 直前のコマンドの再実行
!n n番目 (ヒストリ番号) に実行したコマンドの再実行
!-n もっとも大きいヒストリ番号からnを引いたヒストリ番号のコマンドの再実行
!str 指定された文字列 (str) ではじまる1番最近に実行したコマンドの再実行
% history 4 <ENTER>
    10  15:18   ls
    11  15:29   more history.txt
    12  15:29   a2ps history.txt | lpr -Pnps2
    13  15:32   history	4
% !! <ENTER>
history 4
    11  15:29   more history.txt
    12  15:29   a2ps history.txt | lpr -Pnps2
    13  15:32   history	4
    14  15:33   history 4
% !a2 <ENTER>
a2ps history.txt | lpr -Pnps2
% _

11.2.4.3 実行前のコマンド確認

ヒストリ機能を利用してコマンドを実行する前に, あらかじめコマンドの内容を確認できます. ヒストリ指定の直後でスペースを空けずに `:p' を入力すると, ヒストリリストから指定されたコマンドを表示します. そのままコマンドを実行する場合には, 続けて `!!' を入力します. 次にヒストリ番号9のコマンドの内容を確認し, それを再実行する例を示します.

% !9:p <ENTER>
ls -l
% !! <ENTER>
ls -l 
total 2
-rw-r--r--  1 s00000hf      13450 Nov 18 10:40 history.ps
-rw-r--r--  1 s00000hf       3402 Nov 22 09:35 report.tex
% _

11.2.5 コマンドの編集

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

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

11.2.6 ジョブ管理

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

11.2.6.1 フォアグラウンドジョブとバックグラウンドジョブ

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

% emacs <ENTER>
_

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

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

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

フォアグラウンドジョブとバックグラウンドジョブには, いくつかの違いがあります. フォアグラウンドジョブとバックグラウンドジョブの処理の結果の出力は, どちらも表示されます. しかし, シェルから情報を入力できるのは, フォアグラウンドジョブのみです. 引数として数値やファイル名などの情報を入力することが必要なコマンドを, バックグラウンドジョブとして実行すると,処理が中断されています. その時には, フォアグラウンドジョブにして必要な引数などを入力する必要があります.

11.2.6.2 ジョブの状態を知る

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

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

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

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

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

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

11.2.6.3 強制終了とサスペンド

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

% emacs & <ENTER>
% mozilla & <ENTER>
% jobs <ENTER>
[1]  + 実行中です                emacs 
[2]  - 実行中です                mozilla
% fg %2 <ENTER>
mozilla
<C-z>
^Z
中断
% jobs <ENTER> 
[1]  - 実行中です                emacs
[2]  + 中断                      mozilla
% bg %2 <ENTER>
[2]    mozilla &
% jobs <ENTER>
[1]  + 実行中です                emacs 
[2]    実行中です                mozilla
% fg %1 <ENTER>
emacs
<C-c>
^C
% jobs <ENTER>
[2]  + 実行中です                mozilla
% _

11.2.7 日本語の利用

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

setenv LANG [ロケール値]

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

表 11.6: 日本語LANG環境の設定
ホスト名 ロケール値
zux???webedit ja_JP.EUC
ccz?? ja

次に実行例を示します.

% setenv LANG ja <ENTER>
% _

11.2.7.1 環境変数

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

printenv [環境変数名]
setenv [環境変数名] [値]
unsetenv [環境変数名]

次の実行例では, LANG環境変数を `ja' から `ja.JP_EUC' に変更したのちに, LANG環境変数を解除しています.

% printenv LANG <ENTER>
ja
% setenv LANG ja.JP_EUC <ENTER>
% printenv LANG <ENTER>
ja.JP_EUC
% unsetenv LANG <ENTER>
% printenv LANG <ENTER>
% _
Valid CSS! Valid HTML 4.01!