next up previous contents
Next: 入出力の切り換え(I/O redirection) Up: シェルの機能 Previous: プログラムの実行

ファイル名の置換(展開)

シェルはコマンドラインを解析し、実行すべきコマンドや引数を決定する前に 特殊文字 *, ?, [ ] を見つけるとその特殊文字部分を ファイル名に置き換えます。 いま、ユーザのカレントディレクトリに次の様なファイルがあると仮定します。

$ ls
beer
carrot
ell
rabbit
ここでechoコマンドを使ってファイル名の置換を試してみましょう。 次のようにタイプしてください。
$ echo *
beer carrot ell rabbit
シェルは与えられたコマンドラインの解析を始めます。そして特殊文字 * を見つ けると、カレントディレクトリ内にあるすべてのファイル名で * 部分置き換えま す。そのあとにシェルは起動すべきコマンド名と渡すべき引数を決定します。

echoは特殊文字 * を解釈することも、存在していいることも分かりません。 この場合、echoは4個の引数がシェルから与えられたことを知っているだけなのです。 このようにシェルはgrepやedなどに比べると制限されているものの、次のような 正規表現を解釈することができます。これらの文字をメタ文字と呼びます。 なお、シェルによるメタ文字の展開はファイル名のみが対象となります。

さて、ここで前項で例とした

$ echo Do you        enjoy              minix?
Do you enjoy minix?
を考えてみてください。このコマンドラインにはメタ文字 ? があるのに気が 付いたでしょうか。ところがechoの出力を見るとシェルにより置換が行なわれずにその まま表示されています。これはシェルが手抜きをしたわけではありません。 シェルはコマンドラインの解析で ? を見つけています。そしてカレントディレク トリにあるファイル名との置換を試みています。しかし、置換条件を満たすファイル が見つからないので置換に失敗してし、入力された文字列を そのままを引数としてechoに渡してしまうので minix? がそのまま表示されたのです。

しかし、場合によってはシェルによる置換が思いもよらない弊害を引き起こすことが あります。このためにシェルによってコマンドラインにあるメタ文字の解釈を禁止す る方法が用意されています。[「3.3 引用符」(p.gif) 参照]

シェルがコマンドラインを解析する手順をまとめると概ね次のようになります。

1. コマンドラインから特殊文字 *, ?, [, ] を探す
2. メタ文字が見つかればファイル名で置換を試みる
3. コマンドラインから起動すべきコマンドと引数を取り出しコマンドを起動する


Riichiro Saito
1995年08月29日(火) 11時41分26秒 JST