7    シェルの概要

この章では,オペレーティング・システムのシェルについて紹介します。 この章では次のような項目について説明しています。

この章では,オペレーティング・システムのすべてのシェルに共通な機能を取り上げるとともに,シェル間の相違についてもある程度説明します。 C シェルおよび Bourne,Korn,または POSIX シェルの特殊機能についての詳細は,第 8 章を参照してください。

7.1    シェルの目的

オペレーティング・システムへのユーザ・インタフェースはシェルと呼ばれます。 シェルは,ユーザが入力するコマンドを解釈し,要求されたプログラムを実行して,その結果を画面に表示します。

Tru64 UNIX オペレーティング・システムには次のようなシェルがあります。

システムに設定されているセキュリティ制限や,Korn シェル のライセンス制限に合致すれば,いずれのシェルにもアクセスできます。 すべてのシェルは同じような基本的な機能を実行します。 ユーザが実行したコマンドは,シェルを介してシステムに伝えられます。

コマンドを解釈するだけでなく,シェルはプログラミング言語としても使用できます。 ユーザはコマンドを含むシェル・プロシージャを作成することができ,このシェル・プロシージャは,プログラムと同じようにコマンド行上でシェル・プロンプトに対して実行できます。

シェル・プロシージャを実行するとき,ユーザの現在のシェルはサブシェルを作成 (spawn) します。 サブシェルとは,現在のシェルがプログラムを実行するために新しく作成するシェルのことです。 このため,シェル・プロシージャが実行するコマンド (たとえば cd) は,シェル・プロシージャを起動したシェルには影響を及ぼしません。

シェル・プロシージャを使用すると,長すぎるコマンドや大きく複雑なコマンド・シーケンス,および決まりきった反復的な作業を行うのが簡単になります。

シェル・プログラミングについての詳細は,7.10 節を参照してください。

7.2    C シェル,Bourne シェル,Korn シェル,および POSIX シェルの機能の要約

オペレーティング・システムには,コマンド実行とプログラミングを可能にするという 2 つの機能を兼ね備えた次のようなシェルがあります。

7.2.1    C シェルおよび Korn シェルまたは POSIX シェルの機能に関する詳細情報

C シェルおよび Korn または POSIX シェルは,次のような対話機能を備えています。

Korn および POSIX シェルはインライン編集機能を備えています。 この機能により,以前に入力したコマンドを検索して,それを編集することができます。 この機能を使用するには,viemacs のようなテキスト・エディタの使用方法を知っておく必要があります。

これらのシェル機能の詳細については,第 8 章を参照してください。

7.2.2    制限付き Bourne シェル

オペレーティング・システムでは,指定ユーザに対し,制限付き Bourne シェル (Rsh) で限定された機能を提供することによって,システム・セキュリティを拡張します。 これらの指定ユーザがシステムにログインするときには,制限付き Bourne シェルだけにアクセスする権利が与えられます。 だれが制限付き Bourne シェルにアクセスできるかは,システム管理者が決定します。

制限付きシェルは,より制御されたシェル環境を要求するインストレーションにとって有効です。 このため,システム管理者は,特権と機能が制限されたユーザ環境を作成することができます。 たとえば,システムのゲストであるユーザは全員,ユーザ名 guest の下でしかアクセスできないとします。 システムにログインすると,ユーザ guest は制限付きシェルを割り当てられます。

Rsh の動作は,次の点を除いて sh の動作と同じです。

Rsh に関する詳細は, sh(1b) リファレンス・ページを参照してください。 システム管理者が制限付きシェルを作成する方法については,システム管理者に問い合わせてください。

7.3    シェルの変更

ユーザがシステムにログインすると,システム管理者が指定したシェルに自動的に入ります。 ただし,システム上に設定されているセキュリティ機能によっては,次のことを行うコマンドが入力できます。

以降の各項で,これらの操作について説明します。

7.3.1    実行しているシェルの確認

現在どのシェルを実行しているかを確認するときは,次のコマンドを入力します。

echo $SHELL
 

実行しているシェルのファイル名が表示されます。

Bourne シェル (sh) を実行している場合は,次のような結果が出力されます。

$ echo $SHELL
/usr/bin/sh
$
 

表 7-1 は,表示される各シェルのファイル名,および root 以外のユーザに対する省略時のシステム・プロンプトを示したものです。 システムにより,システム・プロンプトは異なる場合があります。

表 7-1:  シェルのファイル名と省略時のプロンプト

シェル シェル名 省略時のプロンプト
Bourne sh $
制限付き Bourne Rsh $
C csh %
Korn ksh $
POSIX sh $

7.3.2    シェルの一時的変更

システムのセキュリティ機能で許されている場合は,他のシェルを使用することができます。

シェルを一時的に変更するときは,次のコマンドを入力します。

shellname

shellname は使用するシェルのファイル名です。 コマンド行に入力する有効なシェルのファイル名については,表 7-1 を参照してください。 シェルが呼び出されると,正しいシェル・プロンプトが表示されます。

新しいシェルでの作業が終了したら,exit を入力するか Ctrl/D を押すことによって,省略時のシェルに戻ることができます。

たとえば,Korn シェルが省略時のシェルの場合に,C シェルに移り,その後 Korn シェルに戻るには,次のコマンドを入力します。

$ /usr/bin/csh
% exit
$
 

注意

制限付き Bourne シェルを使用している場合は,別のシェルに移ることはできません。

7.3.3    シェルの永久的変更

システムのセキュリティ機能で許されている場合は,省略時のシェルを永久的に変更することができます。 現在のシェルがC シェルである場合,省略時のシェルを変更するには chsh コマンドを使用します。 C シェルを使用していない場合には,システム管理者に問い合わせて,省略時のシェルを変更してください。

C シェルでは,省略時のシェルを変更するには,次のコマンドを入力します。

% chsh
Changing login shell for user.
Old shell: /usr/bin/csh
New shell:
 

新しいシェルの名前を入力してください。 コマンド行に入力する有効なシェル名については,表 7-1 を参照してください。

なお,chsh コマンドを入力した後,その変更を有効にするために,ログアウトしてから改めてログインしなければなりません。

7.4    コマンド入力支援機能

オペレーティング・システムのすべてのシェルには,ユーザの作業を支援する次のような機能があります。

以降の各項で,これらの機能について説明します。

7.4.1    複数コマンドとコマンド・リストの使用

通常,シェルはコマンド行の最初のワードをコマンド名として解釈し,他のワードはすべてそのコマンドの引数として解釈します。 シェルは普通,各コマンド行を単一のコマンドと考えます。 ただし,表 7-2 に示す演算子を使用すれば,単一のコマンド行で複数のコマンドを実行することができます。

表 7-2:  複数コマンド演算子

演算子 動作
; コマンドを順次実行させる。 cmd1 ; cmd2
&& 現在のコマンドが成功した場合に,次のコマンドを実行する。 cmd1 && cmd2
|| 現在のコマンドが失敗した場合に,次のコマンドを実行する。 cmd1 || cmd2
| パイプラインを作成する。 cmd1 | cmd2

以降の項で,コマンドの順次実行 (;),条件付きのコマンド実行 (||と&&),およびパイプラインの使用 (|) について説明します。

7.4.1.1    セミコロン (;) を使用したコマンドの順次実行

コマンドをセミコロン (;) で区切ると,1 行に複数のコマンドを入力することができます。

次の例では,シェルは ls を実行して,それが終了するのを待ちます。 ls が終了すると,シェルは who を実行し,以下同様にして最後のコマンドまで実行します。

$ ls ; who ; date ; pwd
change  file3  newfile
amy    console/1      Jun 4 14:41
Tue Jun 4  14:42:51  CDT  1999
/u/amy
$
 

なお,コマンドのどれかが失敗しても,その他のコマンドは順次実行されます。

コマンド行を読みやすくするために,ブランクまたはタブを使用してコマンドとセミコロン (;) を分離します。 この場合には,シェルはこのようなブランクやタブを無視します。

7.4.1.2    条件付きのコマンド実行

コマンドを 2 つのアンパサンド (&&) または縦線 (||) 演算子で接続すると,シェルは最初のコマンドを実行し,それから次の条件で残りのコマンドを実行します。

アンパサンド (&&) 演算子の構文は次のとおりです。

cmd1 && cmd2 && cmd3 && cmd4 && cmd5

cmd1 が成功すれば,シェルは cmd2 を実行します。 cmd2 が成功すれば,cmd3 を実行し,以下同様に,コマンドが失敗するか最後のコマンドが終了するまで続きます。 コマンドのどれかが失敗すれば,シェルはコマンド行の実行を停止します。

2 本の縦線 (||) 演算子の構文は次のとおりです。

cmd1 || cmd2

cmd1 が失敗すれば,シェルは cmd2 を実行します。 cmd1 が成功すれば,シェルはコマンド行の実行を停止します。

たとえば,コマンド mysort はソート・プログラムであり,ソート処理中に一時ファイル (mysort.tmp) を作成するとします。 ソート・プログラムが正常に終了すれば,一時ファイルを削除して,クリーンアップ処理を行います。 一方,プログラムが失敗した場合は,一時ファイルが削除されないことがあります。 確実に mysort.tmp の削除を行うには,次のコマンド行を入力してください。

$ mysort || rm mysort.tmp
$
 

最初のコマンドが失敗した場合に限り,2 番目のコマンドが実行されます。

7.4.2    パイプとフィルタの使用

パイプとは,2 つの関連するコマンド間の一方向接続です。 あるコマンドがその出力をパイプに書き込み,もう一方のプロセスがその入力をパイプから読み取ります。 2 つ以上のコマンドがパイプ (|) 演算子によって接続されると,パイプラインを形成します。

図 7-1 は,パイプラインを通る入力と出力の流れを示しています。 最初のコマンド (cmd1) の出力は 2 番目のコマンド (cmd2) の入力となり,2 番目のコマンドの出力は 3 番目のコマンド (cmd3) の入力になります。

図 7-1:  パイプラインを通る流れ

フィルタとは,標準入力を読み取り,その入力を変換し,変換済みの入力を標準出力に書き込むコマンドです。 フィルタの典型的な使用例として,パイプライン中の中間コマンドとしてパイプ (|) 演算子で接続して使用する方法があります。 たとえば,ls コマンドを使用して,現在のディレクトリから階層の最下位までの全ディレクトリの内容を再帰的にリストし,その結果を表示するには,次のコマンドを入力します。

$ ls -R | pg
 

この例では,pg コマンドがフィルタです。 これは,pg コマンドが ls -R コマンドからの出力を変換して,一度に 1 画面ずつ表示するからです。

フィルタでないコマンドのなかにも,そのコマンドにフィルタと同じような機能を行わせるフラグを持つものがあります。 たとえば,diff (ファイル比較) コマンドは,通常 2 つのファイルを比較し,その違いを標準出力に書き込みます。 diff の普通の形式は次のとおりです。

diff file1 file2

しかし,どちらかのファイル名の代わりにダッシュ (--) フラグを使用すると,diff は標準入力を読み取って,それを指定されたファイルと比較します。

次のパイプラインでは,ls は現在のディレクトリの内容を標準出力に書き込みます。 diff コマンドは ls の出力を dirfile というファイルの内容と比較して,相違箇所を一度に 1 ページずつ (pg コマンドで) 標準出力に書き込みます。

$ ls | diff - dirfile | pg
 

次の例では,別の種類のフィルタ・プログラム (grep) を使用しています。

$ ls -l | grep r-x | wc -l
     12
$
 

この例では,次のことが行われます。

パイプラインを使用しないで同じ結果を得るには,次のようにします。

  1. ls -l /user の出力をファイルに送る。

    たとえば,次のように入力します。

    $ ls -l > file1
     
    

  2. file1grep r-x の入力として使用し,grep の出力を別のファイルにリダイレクトする。

    たとえば,次のように入力します。

    $ grep r-x file1 > file2
     
    

  3. grep の出力ファイルを wc -l の入力として使用する。

    たとえば,次のように入力します。

    $ wc -l file2
     
    

上記の手順から明らかなように,同じオペレーションでも,パイプラインを使用すると,はるかに容易に行うことができます。

パイプライン中の各コマンドは,別個のプロセスとして実行されます。 パイプラインは一方向 (左から右) にのみ作用し,また,パイプライン中の全プロセスは同時に実行できます。 読み取るべき入力がないとき,または次のプロセスへのパイプが一杯になっているとき,プロセスは一時停止します。

7.4.3    コマンドのグループ化

シェルには複数のコマンドをグループ化する方法が 2 通りあります。 表 7-3 を参照してください。

表 7-3:  コマンドをグループ化する記号

記号 動作
(commands) シェルはサブシェルを作成して,グループ化された commands を別個のプロセスとして実行する。
{commands} シェルはグループ化された commands をユニットとして実行する。 中カッコ ({ }) は Bourne,Korn,および POSIX シェルだけで使用できる。

以降の項で,表 7-3 に示すコマンドをグループ化する記号について詳細に説明します。

7.4.3.1    カッコ ( ) の使用

次のコマンドのグループ化では,シェルはカッコで囲まれたコマンドを別個のプロセスとして実行します。

$ (cd reports;ls);ls
 

シェルはサブシェル (別個のシェル・プログラム) を作成して,ディレクトリ reports に移動し,そのディレクトリ内のファイルをリストします。 サブシェル・プロセスが完了すると,シェルは現在のディレクトリ内のファイルをリストします (ls)。

このコマンドを ( ) を指定しないで入力した場合には,元のシェルがディレクトリ reports に移動して,そのディレクトリ内のファイルをリストした後,そのディレクトリ内のファイルをもう一度リストします。 cd reports;ls コマンドのためのサブシェルも,別個のプロセスも作成されません。

シェルは,カッコ ( ) がコマンド行のどこにあっても認識します。 カッコを本来の意味で (すなわち,コマンドのグループ化を行わずに) 使用するときは,左カッコまたは右カッコの直前にバックスラッシュ (\) を付加して,カッコを引用してください。 たとえば,\( のように指定します。

シェルにおける引用の詳細については,7.4.4 項を参照してください。

7.4.3.2    中カッコ { } の使用

中カッコ { } の使用は Bourne,Korn,および POSIX シェルのみで有効です。

複数のコマンドを中カッコ { } で囲んでグループ化すると,シェルはサブシェルを作成せずにそれらのコマンドを実行します。 次の例では,シェルは date コマンドを実行し,その出力を today.grp ファイルに書き込んだ後,who コマンドを実行して,その出力を today.grp に書き込みます。

$ { date; who ;} > today.grp
$
 

コマンドが中カッコで囲まれていない場合,シェルは date コマンドの出力をディスプレイに表示し,who コマンドの出力をファイルに書き込みます。

シェルはパイプラインとコマンド・リスト中の中カッコ { } を認識しますが,左中カッコがコマンド行の先頭文字である場合に限ります。

7.4.4    引用

シェルにとって特殊な意味を持つ左山カッコ (<),右山カッコ (>),パイプ (|),アンパサンド (&),アスタリスク (*),疑問符 (?) などの文字を予約文字といいます。 オペレーティング・システムの各シェルの予約文字については,第 8 章を参照してください。

予約文字を本来の意味で (すなわち,特殊な意味なしに) 使用するには,表 7-4 に示すように,3 種類のシェル引用規約のいずれかを使用して,その文字を引用します。

表 7-4:  シェル引用規約

引用規約 動作
\ バックスラッシュ --- 単一の文字を引用する。
' ' 一重引用符 --- 文字列を引用する (一重引用符自体を除く)。
" " 二重引用符--- 文字列を引用する ($`,および \を除く)。

以降の項では,表 7-4 に示す引用規約について詳細に説明します。

7.4.4.1    バックスラッシュの使用 ( \ )

単一の文字を引用するときは,次のようにその文字の直前にバックスラッシュ ( \ ) をタイプします。

$ echo \?
?
$
 

このコマンドは単一の疑問符 (?) を表示します。

7.4.4.2    一重引用符の使用 (' ')

文字列を一重引用符で囲むと,シェルはその文字列内のすべての文字 (' 自体を除く) を本来の意味に解釈します。 一重引用符は次の場合に役立ちます。

次の例は,変数名をシェルに解釈させずに表示したい場合に,一重引用符を使用する方法を示しています。

$ echo 'The value of $USER is' $USER
The value of $USER is amy
$
 

echo コマンドは,変数名 $USER が一重引用符内にある場合には,その変数名をそのまま表示しますが,$USER が一重引用符の外にある場合には,その値を解釈します。

変数代入については,7.7.1 項を参照してください。

7.4.4.3    二重引用符の使用 (" ")

二重引用符 (" ") は特殊な引用形式を提供します。 二重引用符内では,予約文字のドル記号 ($),抑音符 ( `),およびバックスラッシュ ( \ ) は,それぞれの特殊な意味を持ちます。 シェルは,二重引用符内のその他のすべての文字は本来の意味に解釈されます。 二重引用符は変数代入において最も頻繁に使用されます。

次の例は,シェル変数の値を含むメッセージにおいて,山カッコ (通常は予約文字) をそのまま表示したい場合に,二重引用符を使用する方法を示しています。

echo "<<Current shell is $SHELL>>"
<<Current shell is /usr/bin/csh>>
$
 

変数代入については,7.7.1 項を参照してください。

7.5    シェル環境

ログインするといつも,省略時のシェルがユーザ固有の作業環境を定義して維持します。 ユーザの環境は,ユーザ識別やシステムのどこで作業しているか,またどんなコマンドを実行しているかなどの特性を定義します。

作業環境は環境変数とシェル変数の両方で定義されます。 省略時のログイン・シェルは環境変数を使用し,それらをユーザが作成するすべてのプロセスやサブシェルに渡します。 シェル変数は現在のシェルだけで有効で,サブシェルには渡されません。

以降の項で,シェル環境,シェル環境の構成方法,およびシェル環境の調整方法について説明します。

7.5.1    ログイン・プログラム

ログインすると必ず,login プログラムが実行されます。 このプログラムは /etc/passwd ファイルに格納されているデータを使用して,実際にログイン・セッションを開始します。 /etc/passwd ファイルには各システム・ユーザについて記述した 1 行の情報が含まれています。 この行には,ユーザ名,パスワード (暗号化された形式),ホーム・ディレクトリ,および省略時のシェルが記述されています。 /etc/passwd ファイルについて詳細は,第 5 章を参照してください。

login プログラムは,login: プロンプトに対してユーザ名を入力した後,実行されます。 このプログラムにより次の機能が行われます。

7.5.2    環境変数

シェル環境は,ユーザ固有の作業環境を定義して維持します。 ユーザの作業環境の特性の大部分は環境変数によって定義されます。

環境変数は名前と値から構成されます。 たとえば,ユーザのログイン・ディレクトリ用の環境変数は HOME という名前であり,その値はログインするときに自動的に定義されます。

環境変数のなかには login プログラムによって設定されるものもありますが,ユーザのシェルに合わせてログイン・スクリプトで定義できるものもあります。 たとえば,C シェルを使用している場合,環境変数は .cshrc ログイン・スクリプトで設定するのが普通です。 ログイン・スクリプトについての詳細は,7.6 節を参照してください。

表 7-5 に,オペレーティング・システムのすべてのシェルで使用できる主な環境変数の一覧を示します。 これらの変数の値の大部分はログイン・プロセスで設定され,その後,セッション中に作成される各プロセスに渡されます。

表 7-5:  主なシェル環境変数

環境変数 説明
HOME ログイン・ディレクトリ,つまりログインが完了すると現在のディレクトリになるディレクトリの名前を指定する。 cd コマンドは省略値として HOME の値を使用する。 この値は login プログラムで設定され,個々のユーザが変更することはできない。
LOGNAME ユーザのログイン名を指定する。
MAIL メール・システムが新たなメールの到着を検出するために使用するファイルのパス名を指定する。 login プログラムがユーザ名に基づいてこの変数を設定する。
PATH システムがコマンドの探索,発見,実行に使用するディレクトリとディレクトリ順を指定する。 この変数はユーザのログイン・スクリプトで設定される。
SHELL 省略時のシェルを指定する。 この変数は,login プログラムにより,/etc/passwd ファイルのエントリに指定されたシェルを使用して設定される。
TERM 使用している端末のタイプを指定する。 この変数は通常,ユーザのログイン・スクリプトで設定される。
TZ 現在の時間帯とグリニッジ平均時との差を指定する。 この変数はシステム・ログイン・スクリプトで設定される。
LANG システムのロケールを指定する。 ロケールは言語,テリトリ,および文字コード・セットの 3 つの部分から構成される。 省略値は C ロケールであり,これは言語が英語,テリトリが米国,コード・セットが ASCII である。 LANG はログイン・スクリプトで設定できる。
LC_COLLATE 名前をソートするときとパターンに文字範囲が指定されたときに使用する照合順序を指定する。 省略値は ASCII 照合順序。LC_COLLATE はログイン・スクリプトで設定できる。
LC_CTYPE ctype関数で使用される現在のロケールの文字分類規則を指定する。 省略値は ASCII 文字の分類。LC_TYPE 変数はログイン・スクリプトで設定できる。
LC_MESSAGES yes/no プロンプトに使用する言語を指定する。 省略値はアメリカ英語であるが,システムによって別の言語を指定することもできる。
LC_MONETARY システムの通貨表記形式を指定する。 省略値はアメリカの通貨表記形式。 LC_MONETARY 変数はログイン・スクリプトで設定できる。
LC_NUMERIC システムの数値形式を指定する。 省略値はアメリカの数値形式。 LC_NUMERIC 変数はログイン・スクリプトで設定できる。
LC_TIME システムの日時形式を指定する。 省略値はアメリカの日時形式。 LC_TIME 変数はログイン・スクリプトで設定できる。

これらの環境変数の多くは,ログイン・プロセス中に,該当するログイン・スクリプトによって設定できます (7.6 節 を参照)。 ただし,これらの値は再設定することができます。 また,省略値が定められていない変数についても設定することができます。 詳しくは7.7.1 項を参照してください。

LANGLC_COLLATELC_CTYPELC_MESSAGESLC_MONETARYLC_NUMERICLC_TIME の各変数についての詳細は,付録 C を参照してください。 この付録では,言語および各国の習慣をサポートする他のシステム機能のコンテキストにおける変数について説明しています。

ユーザ自身の環境変数を作成することもできます。 たとえば,システムによってはユーザが複数のメール・プログラムを利用できるものもあります。 たとえば,システムで mailmh のメール・プログラムが利用でき,それぞれに固有のパス名があるとします。 その場合,各メール・プログラムのパス名について変数を定義することができます。

オペレーティング・システムの各シェルに特有な環境変数についての詳細は,第 8 章を参照してください。 オペレーティング・システムでサポートするシェル環境変数の一覧については, sh(1b)sh(1p)csh(1), および ksh(1) のリファレンス・ページを参照してください。

7.5.3    シェル変数

シェル変数は現在のシェルに対してのみ有効であり,サブシェルには渡されません。 したがって,シェル変数はそれらが定義されているシェルでしか使用できません。 言い換えれば,シェル変数はローカル変数と考えることができます。

シェル変数は,環境変数にすることにより,現在のシェルの外部からアクセスできるようになります。 環境変数についての詳細は,7.7.1 項を参照してください。

また,ユーザ自身のシェル変数を作成することもできます。 たとえば,メール・プログラムのなかには,PAGER 変数を使用して,メールを表示するプログラムを定義するものがあります。 メール・プログラムが mailx だとすると,PAGER 変数を定義して,メールの表示に more プログラムを使用するようにできます。

シェル変数の設定方法については,7.7.1 項を参照してください。

7.6    ログイン・スクリプトとユーザ環境

ログイン・スクリプトとは,ユーザ環境をセットアップするための一連のコマンドが記述されているファイルです。 ログイン・スクリプトには次の 2 種類があります。

省略時のシェルが C シェルの場合 .cshrc ファイルを使用して環境を調整することもできます。 .cshrc はログイン時 (.login の後) およびサブシェルの作成 (spawn) 時に実行されます。 .cshrc ファイルを使用すると変数がサブシェルで自動的に有効になります。

Korn および POSIX シェルでは起動時に,ENV 環境変数によって設定されているファイルを実行します。 この変数は通常 .profile ファイルで設定され,一般には $HOME ディレクトリにある別のファイル .kshrc または .envfile 等に対して設定されます。 このような設定を行う場合には .profile ファイルに次のような記述を追加します。

ENV=~/.kshrc
 

このファイルには通常は,シェル変数,別名定義,関数定義などを記述します。 本書では,このファイルを .kshrc とよびます。

システム・ログイン・スクリプトで基本的な環境は設定されるので,ユーザ自身のログイン・スクリプトは必ず作成しなくてはならないわけではありません。 システム管理者がローカル・ログイン・スクリプトを作成している場合があるので,各ユーザはこれをエディタで編集して使用することができます。

システムに不慣れな場合は,すでに設定されている省略時の環境を使用したいと思うかもしれません。 しかし,システムに慣れるにしたがい,自分のログイン・スクリプトを作成したり修正したいと思うようになるでしょう。

表 7-6 に,Tru64 UNIX オペレーティング・システムの各シェルのシステム・ログイン・スクリプトとローカル・ログイン・スクリプトを示します。 システムにログインするとシェルに応じて,すべてのスクリプトが実行されます。 さらに,任意のシェル・プロンプトに対して csh と入力すると,.cshrc ファイルが実行され,C シェルのサブシェルが作成されます。

表 7-6:  システムおよびローカルのログイン・スクリプト

シェル パス名 システム・ログイン・スクリプト ローカル・ログイン・スクリプト
Bourne /usr/bin/sh /etc/profile .profile
Korn /usr/bin/ksh /etc/profile .profileENV
POSIX /usr/bin/posix/sh /etc/profile .profileENV
C /usr/bin/csh /etc/csh.login .login.cshrc

ホーム・ディレクトリにローカル・ログイン・スクリプトがあるかどうかを確認するためには,ls -a コマンドを使用します。 このコマンドは,ドット (.) で始まるすべてのファイルを,他のエントリと一緒に表示します。

次のカスタマイズ機能は,一般にログイン・スクリプトで設定されています。

システム・ログイン・スクリプトの内容をチェックして,ローカル・ログイン・スクリプトで重複しないようにするとよいでしょう。 たとえば,システム・ログイン・スクリプトでニュースの有無をチェックしていれば,ローカル・ログイン・スクリプトで同じことをする必要はありません。

ログイン・スクリプトの個々の例については,第 8 章を参照してください。

7.7    変数の使用

Tru64 UNIX オペレーティング・システムのすべてのシェルは,環境変数とシェル変数を使用して,ユーザ環境の特性を定義します。 システム管理者は,セット・アップ処理の一環として,適切なログイン・スクリプトで省略時の環境変数およびシェル変数の値を設定しています。

大部分のユーザにとっては,省略時の環境変数およびシェル変数の値で十分です。 しかし,システムに慣れるにしたがい,一部の変数の値を修正したいと思うようになるかもしれません。 たとえば,シェル・プロンプトを定義する変数を再設定して,もっと自分独自のものにしたいと思うかもしれません。 また,非常に長いディレクトリ・パス名を指定するシェル変数を設定して,そのディレクトリを使用するコマンドをタイプする時間を節約できるようにしたいと思うかもしれません (7.7.1 項に示す例を参照)。 あるいは,シェル・プロシージャを作成するとき,変数を設定したほうが便利だと思うかもしれません。 このように変数を創造的に使用すれば,作業環境が改善できることがわかるでしょう。

環境変数のなかには再設定できるものもあれば,読み取り専用で再設定できないものもあります。 つまり,これらの変数は使用はできますが,修正はできません。 詳しくは,該当するシェルのリファレンス・ページ, sh(1b)sh(1p)csh(1), または ksh(1) を参照してください。

環境変数を再設定したり,ユーザ自身のシェル変数を定義するには,次のいずれかを行います。

ユーザはいつでも,任意の変数の値を参照したり表示することができます。 また,どの変数の値もクリアすることができます。

7.7.1    変数の設定

以降の各項で,変数値の設定,参照,表示,クリアの方法について説明します。

7.7.1.1    Bourne シェル,Korn シェル,および POSIX シェルのシェル変数

Bourne,Korn,および POSIX シェルでは,変数は代入文で設定します。 変数設定のための一般形式は次のとおりです。

name = value

name には変数名を指定します。 value には,変数に代入する値を指定します。 コマンド行にはスペースを入れないようにしてください。

シェル変数をサブシェルで使用できるようにするには,次のように export コマンドを入力します。

export name

シェル変数をエクスポートすると環境変数になります。

Bourne シェルの場合は,2 つのステートメントが必要になります。 Korn および POSIX シェルでは,2 つのステートメントを次のように結合することができます。

export name = value

たとえば,place という変数を,U. S. A. という値を代入することによって作成できます。 その場合には,次の文を使用します。

$ place='U. S. A.'
$
 

これ以後は,変数 place は,その値を使用するのとまったく同様に使用することができます。

もっといい例として,Bourne シェルを使用していて,シェル・プロンプトを一時的に自分独自のものにしたいとします。 省略時の Bourne シェル・プロンプトは,PS1 環境変数によって設定されるドル記号 ($) です。 それを What Shall I Do Next? > に設定するには,次のコマンドを入力します。

$ PS1='What Shall I Do Next? >'
What Shall I Do Next? >
 

このシェル・プロンプトをサブシェルでも利用できるようにするには,次のコマンドを入力します。

$ export PS1
 

この What Shall I Do Next? > というプロンプトはセッションを通して有効です。 この新しいプロンプトを永続的なものにしたい場合は,.profile ファイルに同じ代入文と export コマンドを入力してください。

もう 1 つ例を挙げると,タイプする時間を節約するため,何度も使用する長いパス名の変数を定義したいとします。 ディレクトリ /usr/sales/shoes/women/retail/reports を表わす変数 reports を定義するには,次のように入力します。

$ reports=/usr/sales/shoes/women/retail/reports
 

変数を設定したのちに参照するには,変数名の前に$を入力します。 変数参照についての詳細は,7.7.2 項を参照してください。

このセッション中に入力する任意のコマンドで変数 reports を使用できます。 このプロンプトを永続的なものにする場合は,.profile ファイルに同じ代入文を入力してください。

7.7.1.2    C シェルの変数

C シェルでは,環境変数は setenv コマンドを使用して設定します。 setenv コマンドの一般形式は次のとおりです。

setenv name value

name には変数名を指定します。 value には,変数に代入する値を指定します。

PATH 環境変数を設定する例として,7.8 節を参照してください。

シェル変数は set コマンドで設定します。 set コマンドの一般形式は次のとおりです。

set name = value

name には変数名を指定します。 value には,変数に代入する値を指定します。 value にスペースを含む場合には,式全体を一重引用符 (') で囲んでください。

たとえば,プロンプトを変更したいとします。 省略時の C シェル・プロンプトは % です。 それを Ready? > に変えたいときは,コマンド行に次のように入力します。

% set prompt='Ready? >'
Ready? >
 

Ready? > プロンプトはセッションを通して有効です。 Ready? > プロンプトから別のシェルを実行すると,その新しいシェルのプロンプトが表示されます。 この新しいプロンプトを永続的なものにする場合は,.cshrc ファイルに同じコマンドを入力してください。

7.7.1.3    すべてのシェルにおける変数の設定

Tru64 UNIX オペレーティング・システムの任意のシェルで,環境変数またはシェル変数を設定あるいは再設定するときは,次のいずれかを行います。

7.7.2    変数の参照 (パラメータ置換)

コマンド行で変数の値を参照するには,変数名の前にドル記号 ($) を入力します。 $ によって,現在使用しているシェルは変数名を変数の値に置き換えます。 これはパラメータ置換と呼ばれるものです。

たとえば,長いパス名 /user/reports/Q1/march/sales を表わす変数 sales をあらかじめ定義しておいて,この変数を cd コマンドで使用したいとします。 これを行うには,次のように sales 変数を指定して cd コマンドを入力します。

$ cd $sales
$
 

その後,pwd コマンドを入力して,ディレクトリが変更されたことを確認します。

$ pwd
/user/reports/Q1/march/sales
$
 

この例では,シェルは変数名 sales をディレクトリの実際のパス名 /user/reports/Q1/march/sales に置き換えます。

7.7.3    変数値の表示

自分のシェルに現在設定されているすべての変数の値を表示させることができます。 変数値は,単独で表示することもグループとして表示することもできます。

単一の変数の値を表示するには,echo コマンドを次の一般形式で使用します。

echo $variable

variable には,値を表示させる変数を指定します。

たとえば,Korn シェルを使用している場合に,SHELL 環境変数の値を表示させたいとします。 これを行うには,次のコマンドを入力します。

$ echo $SHELL
/usr/bin/ksh
$
 

Bourne,Korn,および POSIX シェルの場合,現在設定されているすべての変数の値を表示するには,オプションなしで set コマンドを使用します。 たとえば,次の例は Bourne シェルに現在設定されている値の一覧を表示します (使用しているシステムにより出力は異なります)。

$ set
EDITOR=emacs
HOME=/users/chang
LOGNAME=chang
MAIL=/usr/mail/chang
PATH=:/usr/bin:/usr/bin/X11
PS1=$
SHELL=/usr/bin/sh
TERM=xterm
$
 

C シェルの場合,現在設定されているすべてのシェル変数の値を表示するには,オプションなしで set コマンドを使用します。 現在設定されているすべての環境変数の値を表示するには,オプションなしで setenv コマンドまたは printenv コマンドを使用します。

7.7.4    変数値のクリア

現在設定されている変数値のほとんどは削除することができます。 ただし,次の変数はクリアできないことに注意してください。

これらの変数についての詳細は,該当するシェルのリファレンス・ページ, sh(1b)sh(1p)csh(1), または ksh(1) を参照してください。

Bourne,Korn,および POSIX シェルでは,環境変数とシェル変数の両方を unset コマンドでクリアします。 unset コマンドの形式は次のとおりです。

unset name

name には変数名を指定します。

C シェルでは,環境変数は unsetenv コマンドでクリアします。 unsetenv コマンドの形式は次のとおりです。

unsetenv name

name には変数名を指定します。

シェル変数は unset コマンドでクリアします。 unset コマンドの形式は次のとおりです。

unset name

name には変数名を指定します。

たとえば,Korn シェルを使用している場合に,place という変数を作成し,その変数に U. S. A. という値を割り当てているとします。 この変数をクリアするには,次のように入力します。

$ unset place
$
 

変数の設定と参照についての詳細は,該当するシェルのリファレンス・ページを参照してください。

7.8    シェルによるコマンドの見つけ方

ユーザがコマンドを入力すると,シェルはディレクトリのリストを探索して,コマンドを見つけます。 このディレクトリのリストは PATH 環境変数によって指定します。

多くのインストレーションでは,システム管理者が新規ユーザに対して省略時の PATH ディレクトリを指定します。 しかし,経験を積んだユーザは,これらの PATH ディレクトリを変更する必要があるかもしれません。

PATH 変数には,探索するディレクトリのリストが含まれ,各ディレクトリはコロン (:) で区切られてます。 シェルは,ディレクトリがリストされている順に従って,ユーザの入力するコマンドを探索します。

PATH の値を確認するには, echo コマンドを使用します。 たとえば,C シェルを使用しているときに,次のように入力したとします。

% echo $PATH
/usr/bin:/usr/bin/X11
% 
 

この echo コマンドからの出力は,上記の例の探索順が次のとおりであることを示しています。 なお,システムによって出力は異なります。

一般に,PATH は適切なログイン・スクリプトで環境変数として設定されます。 Bourne,Korn,および POSIX シェルでは,PATH 変数は通常 .profile スクリプトで設定されます。 C シェルでは,通常,.login スクリプトで設定されます。

探索経路を変更したい場合は,PATH 変数に新しい値を割り当てることができます。 たとえば,Bourne シェルを使用しているとき,いくつかのオペレーティング・システムのコマンドの代りに,ユーザ独自のコマンドを使用することにしたとします。 そこで,探索パスに $HOME/usr/bin/ を追加します。 新しい PATH 変数値を現在のログイン・セッションについて有効なものにしたい場合は,コマンド行に次のように入力してください。

$ export PATH=$HOME/usr/bin:/usr/bin:/usr/bin/X11
$
 

この新しい PATH 変数値を将来の全セッションにわたって有効にしたい場合には,.profile スクリプトの PATH 変数を修正してください。 .profile スクリプトに対して行った変更は,次回ログインしたときに有効になります。

7.9    ログアウト・スクリプトの使用

セッションを終了すると自動的に実行されるログアウト・スクリプトを作成することができます。 ログイン・スクリプトと同様に,.logout ファイルはユーザのホーム・ディレクトリになければなりません。

ログアウト・スクリプトは次の目的に使用できます。

ログアウト・スクリプトを作成するには,次の手順に従います。

  1. テキスト・エディタを使用して,ホーム・ディレクトリに .logout というファイルを作成する。

  2. 実行させるコマンドをそのファイルに入力する。

    概略については1.2 節を参照。

  3. テキストを保管して,エディタを終了する。

  4. 次のコマンドを入力して,.logout ファイルに適切な実行許可があることを確認する。

    $ chmod u+x .logout
    $
     
    

必ずしも .logout ファイルを使用する必要はありません。 これはユーザの作業環境を改善する便利な手段です。

7.9.1    ログアウト・スクリプトとシェル

C シェルを使用している場合,ログアウトすると .logout スクリプトが自動的に実行されます。

Korn または POSIX シェルを使用しているときに,ログアウト・スクリプトを使用したい場合は,.profile スクリプトに特殊なトラップが設定されていることを確認しなければなりません。 トラップとは,端末からの指定された信号を探して,指定のコマンドまたはコマンド・セットを実行するコマンド・シーケンスのことです。

.profile スクリプトに次の行が設定されていない場合には,テキスト・エディタを使用して追加しなければなりません。

trap $HOME/.logout 0
 

この文は,ゼロ (0) 信号を受信すると必ず .logout スクリプトを実行するようシステムに指示するものです。 ゼロ (0) 信号は,ログアウトするときに自動的に発生します。

7.9.2    .logout ファイルの例

この項で示すサンプルの .logout ファイルは,次のことを行います。

番号記号 (#) で始まる行は,その下のコマンドについて説明しているコメント行です。

# Clear the screen
clear
 
# Display the name of your system, your user name,
# and the time and date that you logged out
echo `hostname` :  `whoami` logged out on `date`
 
# Run the find command in the background. This command
# searches your login directory hierarchy for all
# temporary files that have not been accessed in
# 7 days and then deletes them.
find ~ -name '*.tmp' -atime +7 -exec rm {} \; &
 
# A parting message
echo "Good Day. Come Back Soon"
 

7.10    シェル・プロシージャの使用 (スクリプト)

シェルは,コマンド行から入力されたコマンドを実行するだけでなく,ファイルに含まれているコマンドを読み取って実行することができます。 このようなファイルは,シェル・プロシージャまたはシェル・スクリプトと呼ばれます。

シェル・プロシージャの作成は簡単で,しかもそれを使用すると,より効率的に作業を進めることができます。 たとえば,頻繁に使用するコマンドを 1 つのファイルに入れておけば,プロシージャの名前だけを入力することによって,それらを実行することができます。 このようなことからも,シェル・プロシージャを使用するとたいへん便利なことがわかるでしょう。 したがって,本来なら多数のコマンドをコマンド行に入力する必要がある反復的な作業を行う場合に役立ちます。

シェル・プロシージャはコンパイルする必要のないテキスト・ファイルであるため,作成と保守が簡単です。

各シェルには固有のネイティブ・プログラミング言語があります。 すべてのシェルにあてはまるプログラミング言語の機能を次に示します。

各シェルの特定のプログラミング機能についての詳細は,第 8 章を参照してください。

7.10.1    シェル・プロシージャの作成と実行

シェル・プロシージャの作成と実行は,次の手順に従って行います。

  1. 作業に必要なコマンドのファイルを作成する。

    このファイルは,一般のテキスト・ファイルと同様に作成します。 つまり,vi または他の編集プログラムを使用して行います。 このファイルには,任意のシステム・コマンドまたはシェル・コマンドを入れることができます。 詳しくは, sh(1b)sh(1p)csh(1), または ksh(1) のリファレンス・ページを参照してください。

  2. chmod +x コマンドを使用して,ファイルに x (実行) 状態を付与する。

    たとえば,コマンド chmod g+x reserve は,グループ (g) のすべてのユーザに対して,reserve という名前のファイルを実行可能にします。 chmod コマンドについての詳細は,第 5 章を参照してください。

  3. ファイル名を入力して,そのプロシージャを実行する。

    そのプロシージャ・ファイルが現在のディレクトリにない場合はパス名を入力します。

次に示す例は,ls -l コマンドの出力をファイル・サイズによってソートする,lss という名前の単純なシェル・プロシージャです。

#! /usr/bin/csh
# lss: sort and list
ls -l | sort -n +4
 

表 7-7lss の各行について説明します。

表 7-7:  シェル・スクリプト例の説明

シェル・コマンド 説明
#! /usr/bin/csh シェル・プロシージャを実行するシェルを指定する。 [脚注 1]
#lss: list and sort シェル・プロシージャの目的を説明するコメント行。
ls -l | sort -n +4 シェル・プロシージャのコマンド。 このプロシージャはディレクトリ 内のファイルをリストする (ls -l)。 ls -l コマンドからの出力は sort コマンドにパイプされる (| sort -n +4)。 このコマンドは ls -l 出力の最初の 4 カラムを読み飛ばし,5番目のカラム (ファイル・サイズ・カラム) を数値でソートしてから,その行を標準出力に書き込む。

lss プロシージャを実行するには,lss と入力します。 システムの出力例は次のようになります。

$ lss
-rw-rw-rw-  1 larry  system   65 Mar 13 14:46 file3
-rw-rw-rw-  1 larry  system   75 Mar 13 14:45 file2
-rw-rw-rw-  1 larry  system  101 Mar 13 14:44 file1
$
 

7.10.2    実行シェルの指定

特にC シェルと他のシェルとの間には構文上の違いが存在することがあるため, シェル・プロシージャの実行に使用するシェルを指定したい場合があります。

省略時には,オペレーティング・システムは,ユーザが実行するシェル・プロシージャはログイン・シェルと同じシェルで実行されるものと想定します。 たとえば,ログイン・シェルが Korn シェルであれば,省略時には,シェル・プロシージャはその同じシェルで実行されます。

省略値を無効にする機能は,多くのユーザが実行するシェル・プロシージャにとって非常に便利なものです。 なぜなら,この機能によって,ユーザのログイン・シェルにかかわらず,シェル・プロシージャを正しいシェルで実行できるからです。 この省略時の実行シェルを変更するには,次のコマンドをシェル・プロシージャの 1 行目に入れてください。

#!shell_path
 

shell_path には,そのプロシージャを実行させるシェルの完全パス名を指定します。

たとえば,シェル・プロシージャをC シェルで実行したい場合には,そのシェル・プロシージャの1行目は次のようになります。

#!/usr/bin/csh