bash - コマンド (プログラム) の説明 - Linux コマンド集 一覧表
- 名前
- 書式
- 著作権
- 説明
- オプション
- 引き数
- 起動
- 定義
- 予約語
- シェルの文法
- コメント (COMMENTS)
- クォート
- パラメータ
- 展開
- リダイレクト
- エイリアス
- 関数
- 算術式評価
- 条件式
- 単純なコマンドの展開
- コマンドの実行
- コマンド実行環境
- 環境
- 終了ステータス
- シグナル
- ジョブ制御
- プロンプト
- READLINE ライブラリ
- 履歴 (HISTORY)
- 履歴の展開
- シェルの組み込みコマンド
- 制限付きのシェル(RESTRICTED SHELL)
- 関連項目
- ファイル
- 著者
- バグ報告
- バグ
名前
bash - GNU Bourne-Again SHell
書式
bash [options] [file]
著作権
Bash is Copyright (C) 1989-2001 by the Free Software Foundation, Inc.
説明
bash は、標準入力やファイルから読み込んだコマンドを実行する、 sh 互換のコマンド言語インタプリタです。 bash には、Korn シェルや C シェル (ksh や csh ) の便利な機能も採り入れられています。
bash は IEEE POSIX Shell and Tools specification (IEEE Working Group 10032) に準拠する実装を目指しています。
オプション
bash は以下のオプションを起動時に解釈します (組み込みコマンド set の説明で述べられている 1 文字のシェルオプションも使えます):
- -c string
- -c オプションが指定されると、コマンドが string から読み込まれます。 string の後に引き数があれば、これらは 位置パラメータ (positional parameter: $0 からはじまるパラメータ) に代入されます。
- -r
- -r オプションが指定されると、 bash は 制限された状態 (restricted) となります (後述の 制限付きのシェル を参照)。
- -i
- -i オプションが指定されると、 bash は 対話的 (interactive) に動作します。
- -s
- -s オプションが指定された場合と、 オプションをすべて処理した後に引き数が残っていなかった場合には、 コマンドは標準入力から読み込まれます。 このオプションを使うと、 対話的シェルを起動するときに 位置パラメータを設定できます。
- -D
- 二重引用符によるクォート文字列 (double-quoted strings) に $ が前置されたものを、全てリストして標準出力に出力します。 これらは、カレントロケールが C または POSIX 以外の時に、 翻訳の対象となるべき文字列です。 このオプションを指定すると、 自動的に -n オプションも指定されたことになります。 つまりコマンドは全く実行されません。
- --
-
--
はオプションの終わりを示し、それ以降のオプション処理を行いません。
--
以降の引き数は全て、ファイル名や引き数として扱われます。
引き数
-
は
--
と同じです。
bash が解釈するオプションには複数の文字からなるものもたくさんあります。 このようなオプションを認識させるためには、 コマンドライン中で 1 文字のオプションよりも前に置かなければなりません。
- --dump-po-strings
- -D と同じですが、 出力は GNU gettext の po (ポータブルオブジェクト) ファイル形式で行われます。
- --dump-strings
- -D と同じです。
- --help
- 使用方法についてのメッセージを標準出力に表示し、正常終了します。
- --init-file file
- --rcfile file
- 対話的シェルとして起動された場合、 個人用の初期化ファイル ~/.bashrc の代わりに file からコマンドを実行します (後述の 起動 セクションを参照)。
- --login
- ログインシェル (後述の 起動 セクションを参照) として起動されたかのように bash を動作させます。
- --noediting
- シェルが対話的動作の場合、コマンドラインを読み込むときに GNU readline ライブラリを使用しません。
- --noprofile
- システム全体用の起動ファイル および個人用の初期化ファイル ~/.bash_profile , ~/.bash_login , ~/.profile のいずれも読み込みません。デフォルトでは、 bash はログインシェルとして起動された時に これらのファイルを読み込みます (後述の 起動 セクションを参照)。
- --norc
- シェルが対話的動作を行う場合に、個人用初期化ファイル ~/.bashrc の読み込み・実行を行いません。シェルが sh として起動された場合には、このオプションはデフォルトで有効になります。
- --posix
- bash の動作のうち、 デフォルトの振舞いが POSIX 1003.2 の標準と異なる部分を、 標準に適合するように変更します (posix モード )。
- --restricted
- シェルの動作を制限します (後述の 制限付きのシェル セクションを参照)。
- --verbose
- -v と同じです。
- --version
- 実行された bash のバージョン情報を標準出力に表示し、正常終了します。
引き数
オプション処理の後に引き数が残っており、かつ -c オプションと -s オプションのいずれも指定されていない場合、 最初の引き数はファイル名とみなされ、 そのファイルにシェルコマンドが記述されているとみなされます。 このように bash が起動された場合、 $0 にそのファイルの名前が設定されます (残りの引き数は位置パラメータに設定されます)。 bash はこのファイルからコマンドの読み込みと実行を行い、そして終了します。 bash の終了ステータスは、 このスクリプト中で実行された最後のコマンドの終了ステータスになります。 コマンドが全く実行されなければ、終了ステータスは 0 です。
起動
ログインシェル(login shell) とは、0 番目の引き数の最初の文字が - であるシェル、または --login オプション付きで起動されたシェルのことです。
対話的な シェルとは、 オプションでない引数がなく、 標準入力と標準出力がいずれも端末に接続されていて (これは isatty (3)で調べられます)、 -c オプションが指定されていない状態で起動されたシェル、または -i オプション付きで起動されたシェルのことです。 bash が対話的に動作している場合には、 PS1 が設定され、 $- に i が含まれます。 これを利用すると、対話的動作の状態であるかどうかを、 シェルスクリプトや起動ファイルの内部で調べられます。
以下の段落では、 bash がどのように起動ファイルを実行するかを説明します。 以下のファイルのいずれかが、 「存在しているが読み込みできない」場合は、 bash はエラーを報告します。ファイル名に含まれるチルダは、 後述の 展開 セクションにおける "チルダ展開" の項目で述べるように展開されます。
bash が対話的なログインシェルとして起動されるか、 --login オプション付きの非対話的シェルとして起動されると、 /etc/profile ファイルが存在すれば、 bash はまずここからコマンドを読み込んで実行します。 このファイルを読んだ後、 bash は ~/.bash_profile , ~/.bash_login , ~/.profile をこの 順番で探します。 bash は、この中で最初に見つかり、かつ読み込みが可能であるファイルから コマンドを読み込んで実行します。 --noprofile オプションを使ってシェルを起動すれば、 この動作を行わないようにできます。
ログインシェルが終了するときには、 ~/.bash_logout ファイルがあれば、 bash はこれを読み込んで実行します。
ログインシェルでない対話的シェルとして起動されると、 ~/.bashrc ファイルがあれば、 bash はここからコマンドを読み込み、実行します。 この動作は --norc オプションで行わないようにできます。 --rcfile file オプションを使うと、 コマンドの読み込みと実行を ~/.bashrc からでなく file から行わせることができます。
(例えばシェルスクリプトを実行するために) 非対話的に起動されると、
bash
は環境変数
BASH_ENV
を調べ、この変数が定義されていればその値を展開し、
得られた値をファイル名とみなして、
そこからコマンドの読み込みと実行を行います。
つまり
bash
は以下のコマンドが実行されたのと同じように動作します:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
ただし、ファイル名を探すために
PATH
環境変数の値が使われることはありません。
sh という名前で bash を起動すると、 bash は古くからある sh の起動動作をできるだけ真似しようとします。 また POSIX 標準にもできるだけ従おうとします。 対話的なログインシェルとして起動されると、 あるいは --login オプション付きの非対話的シェルとして起動されると、 このシェルはまず /etc/profile と ~/.profile の順でコマンドの読み込みと実行をしようとします。 --noprofile オプションを使うと、この動作を行わないようにできます。 sh という名前の対話的シェルとして起動されると、 bash は環境変数 ENV を調べ、この変数が定義されていればその値を展開し、 展開で得た値をコマンドの読み込みと実行を行うためのファイル名として使います。 sh という名前で起動されたシェルは、 他の起動ファイルからコマンドの読み込みと起動を行うことはないので、 --rcfile オプションは全く効果を持ちません。 sh という名前の非対話的シェルとして起動されると、 このシェルは他の起動ファイルを何も読み込みません。 sh として起動された場合、 bash は起動ファイルの読み込みを行った後に POSIX モードに入ります。
--posix コマンドラインオプション等により bash が POSIX モードで起動されると、 bash は起動ファイルに関して POSIX 標準に従います。 このモードでは、対話的シェルは ENV 環境変数を展開し、 展開して得られた名前のファイルからコマンドの読み込みと実行を行います。 他の起動ファイルは全く読み込みません。
bash は、自分を起動したのがリモートシェルデーモン (通常は rshd ) かどうかを調べます。 rshd によって実行されていると bash が判断した場合、 ~/.bashrc が存在し、かつ読み込み可能であれば、 bash はコマンドをこのファイルから読み込んで実行します。 sh として呼び出された場合には、この動作は行いません。 --norc オプションを使えばこの動作を禁止できますし、 --rcfile オプションを使えば他のファイルを読ませるようにもできます。 しかし一般的には rshd は これらのオプションを付けてシェルを起動しませんし、 指定もできないようになっています。
シェルが実ユーザ (グループ) ID と異なる実効ユーザ (グループ) ID で起動され、 かつ -p オプションが与えられていない場合は、 起動ファイルは全く読み込まれず、シェル関数は環境から継承されず、 SHELLOPTS が環境変数に含まれていても無視され、 実効ユーザ ID には実ユーザ ID が設定されます。 -p オプションが起動時に与えられた場合、 起動時の動作は同じですが、 実効ユーザ ID は再設定されません。
定義
このドキュメントの残りの部分では、 以下の定義を使用します。
- ブランク (blank)
- 空白文字またはタブ文字
- 単語 (word)
- シェルが 1 単位とみなす文字並び。 トークン(token) とも言われます。
- 名前 (name)
- 英数字とアンダースコア文字だけから構成され、 かつ最初の文字が英字かアンダースコア文字である 単語 。 識別子 (identifier) とも言われます。
- メタ文字 (metacharacter)
-
クォートされていない場合に、単語区切りとなる文字。
以下の文字のうちのいずれかです:
| & ; ( ) < > スペース タブ
- 制御演算子
-
制御機能を持つトークン
。
以下のシンボルのうちのいずれかです:
|| & && ; ;; ( ) | <newline>
予約語
予約語 (reserved word)
とはシェルにとって特別な意味を持つ単語です。
以下の単語がクォートされておらず、
かつ単純なコマンド (simple command) の
先頭の単語 (後述の
シェルの文法
を参照) であるか、
case
コマンドや
for
コマンドの 3 番目の単語である場合には、予約語として認識されます:
! case do done elif else esac fi for function if in select then until while { } time
シェルの文法
単純なコマンド (Simple Commands)
単純なコマンド (simple command ) とは、 変数の代入を並べたもの (これは省略可能です) の後に、 ブランク区切りの単語とリダイレクションを記述し、 最後に制御演算子を置いたものです。 最初の単語は実行するコマンドを指定します。 残りの単語は起動されるコマンドに引き数として渡されます。
単純なコマンドの返り値はコマンドの終了コードですが、シグナル n を受けてコマンドが終了した場合には 128+n となります。
パイプライン (Pipeline)
パイプライン (pipeline)
は、記号
|
で区切った 1 つ以上のコマンド列です。
パイプラインのフォーマットを以下に示します:
[time
[-p
]] [ ! ] command
[ |
command2
... ]
command の標準出力は command2 の標準入力に接続されます。 この接続は、 コマンドで指定したどのリダイレクションよりも先に実行されます (後述の リダイレクション を参照)。
パイプラインの前に、予約語である ! がある場合、 そのパイプラインの終了ステータスは最後のコマンドの終了ステータスの論理値の NOT を取ったものになります。 それ以外の場合には、 パイプラインのステータスは最後のコマンドの終了ステータスになります。 値を返す前に、シェルはパイプライン中の全てのコマンドが終了するのを待ちます。
パイプラインの前に予約語 time がある場合、コマンドの実行にかかった 経過時間・ユーザ時間・システム時間がパイプラインの終了時に報告されます。 -p オプションを指定すると、 出力フォーマットが POSIX 仕様に変わります。 変数 TIMEFORMAT には、経過時間情報の表示の仕方を指定するフォーマット文字列を 設定できます (後述の シェル変数 の項の TIMEFORMAT に関する説明を参照)。
パイプライン中の各コマンドは、それぞれ別のプロセスとして (つまりサブシェル内で) 実行されます。
リスト
リスト (list) とは、1つ以上のパイプラインを演算子 ; , & , && , || のいずれかで区切って並べ、最後に ; , & , <newline> のいずれか (これは省略可能です) を置いたものです。
リスト演算子のうち、 && と || の優先順位は同じです。これらの次に、 ; と & が同じ優先順位で続きます。
コマンドが制御演算子 & で終わっている場合、シェルはコマンドをサブシェル内で バックグラウンド (background) で実行します。 シェルはコマンドが終了するのを待たずに、返却ステータス 0 を返します。 コマンドを ; で区切った場合には、これらは順番に実行されます。 シェルはそれぞれのコマンドが終了するのを順番に待ちます。 返却ステータスは、最後に実行したコマンドの終了ステータスになります。
制御演算子
&&
は AND リストを示し、
||
は OR リストを示します。
AND リストは
command1
&&
command2
という形式であり、 command1 が終了ステータス 0 を返した場合に限り command2 が実行されます。
OR リストは
command1 || command2
という形式であり、 command1 が 0 以外の終了ステータスを返した場合に限り command2 が実行されます。AND リストと OR リストの返却ステータスは、 リスト中で最後に実行されたコマンドの終了ステータスです。
複合コマンド(Compound Commands)
複合コマンド (compound command) を以下に示します:
- (list )
- list はサブシェル内で実行されます。 シェルの環境に影響を与えるような変数の代入や組み込みコマンドは、 コマンドの終了後に影響を残しません。 返却ステータスは list の終了ステータスです。
- { list ; }
- list が単に現在のシェル環境で実行されます。 list の最後は改行文字かセミコロンでなければなりません。これは グループコマンド(group command) と呼ばれます。返却ステータスは list の終了ステータスです。
- ((expression ))
- expression が後述の 算術式評価 で説明される規則に従って評価されます。 式の値が 0 でない場合、返却ステータスは 0 になります。そうでない場合、 返されるステータスは 1 になります。これは let "expression " と全く同じものです。
-
条件式 expression
の評価値に従って 0 または 1 を返します。
式は後述の
条件式
で説明する、プライマリによって構成されます。
単語分割とパス名展開は
の間の単語に対しては行われません。
チルダ展開、パラメータと変数の展開、算術式展開、コマンド置換、
プロセス置換、クォート除去は実行されます。
== 演算子と != 演算子が使われたとき、 演算子の右の文字列はパターンと解釈され、 後述のパターンマッチング で説明する規則に従ってマッチングが行われます。 文字列がパターンにマッチすれば返り値は 0 であり、 マッチしなければ返り値は 1 になります。 パターンの任意の部分をクォートして、文字列としてマッチさせることもできます。
式は以下の演算子を使って繋げられます。 以下に演算子を優先度の順に示します:
- ( expression )
- expression の値を返します。これを用いて、 演算子の通常の優先度を変更できます。
- ! expression
- expression が偽ならば真になります。
- expression1 && expression2
- expression1 と expression2 が両方とも真であれば真になります。
- expression1 || expression2
-
expression1
と
expression2
のどちらかが真であれば真となります。
expression1 の値だけで条件式全体の返り値が決定できれば、 && 演算子と || 演算子は expression2 を実行しません。
- for name [ in word ] ; do list ; done
- in に続く単語のリストが展開され、要素のリストが生成されます。 変数 name には、このリストの各要素が順番にセットされ、その度に list が実行されます。「in word 」が省略された場合、 for コマンドは、設定されている位置パラメータそれぞれに対して list を一度ずつ実行します(後述の パラメータ を参照)。 返却ステータスは実行された最後のコマンドの終了ステータスになります。 in に続く要素を展開した結果が空となった場合、 コマンドは全く実行されず、返却ステータス 0 が返されます。
- for (( expr1 ; expr2 ; expr3 )) ; do list ; done
- 最初に、算術式expr1 が、後述の 算術式評価 で説明される規則に従って評価されます。 次に、算術式expr2 がゼロになるまで繰り返し評価されます。 算術式expr2 の評価結果がゼロでなければ、その度毎にlist が実行され、 算術式expr3 が評価されます。 どの算術式も省略された場合は、 評価結果が 1 とみなされた場合のように振る舞います。 返却ステータスは list 中で実行された 最後のコマンドの終了ステータスとなりますが、 算術式のいずれかが無効である場合には不正な値となります。
- select name [ in word ] ; do list ; done
- in に続く単語のリストが展開され、要素のリストが生成されます。 展開された単語の集合が番号付きで標準エラー出力に出力されます。 「in word 」が省略された場合、 位置パラメータが出力されます (後述の パラメータ を参照)。続いて PS3 が表示され、標準入力から 1 行の読み込みが行われます。 表示された単語のいずれかに対応する数字がこの行に含まれていれば、 name の値としてその単語が設定されます。 行が空であれば、単語とプロンプトが再び表示されます。 EOF を読み込むとコマンドが終了します。 これ以外の値の場合には、 name には空文字列が設定されます。読み込んだ行は変数 REPLY に格納されます。 break または return コマンドが実行されるまで、選択を行うたびに list が実行されます。 select の終了ステータスは、 list 中で最後に実行したコマンドの終了ステータスですが、 コマンドが全く実行されなかった場合には 0 となります。
- case word in [ [(] pattern [ | pattern ]
- case コマンドは最初に word を展開し、それぞれの pattern に対して順にマッチングを試みます。 マッチングの際にはパス名展開 (後述の パス名展開 を参照) と同じ規則が用いられます。 マッチするものが見つかると、これに対応する list が実行されます。 マッチするものが見つかったら、それ以降のマッチングは行われません。 マッチするパターンが無ければ、終了ステータスは 0 になります。 マッチするものがあったら、終了ステータスは list 中で最後に実行されたコマンドの終了ステータスになります。
- if list ; then list;
- [ elif list ; then list ; ] ... [ else list ; ] fi 最初に if list が実行されます。この終了ステータスが 0 ならば、then list が実行されます。 そうでなければ elif list がそれぞれ順番に実行され、 この終了ステータスが 0 ならば、対応する then list が実行され、コマンドが終了します。そうでなければ、else list が (もし存在すれば) 実行されます。 終了ステータスは最後に実行されたコマンドの終了ステータスですが、 真と評価された条件が全く無い場合には 0 となります。
- while list ; do list ; done
- until list ; do list ; done
- while コマンドは、list 中の最後のコマンドが終了ステータス 0 を返すまで、繰り返して do list を実行します。until コマンドは while コマンドとほぼ同じですが、 評価の条件が否定となる点が異なります。 do list は、 list 中の最後のコマンドが 0 以外の終了ステータスを返す限りずっと実行されます。 while コマンドと until コマンドの終了ステータスは、 do list で実行された最後のコマンドの終了ステータスになりますが、 コマンドが全く実行されなかった場合には 0 になります。
- [ function ] name () { list ; }
- name という名前の関数を定義します。関数の本体(body) は、 { と } で囲まれたコマンドの リスト です。単純なコマンドの名前として name が指定されると、 必ずこのリストが実行されます。 関数の終了ステータスは、 関数本体で最後に実行されたコマンドの終了ステータスです (後述の 関数 を参照)。
コメント (COMMENTS)
シェルが対話的でない場合、または対話的なシェルにおいて 組み込みコマンドの shopt に対する interactive_comments オプションが有効となっている (後述の シェルの組み込みコマンド を参照すること) 場合には、 # で始まる単語があると、その単語とその行の残りの文字が全て無視されます。 対話シェルでは、 interactive_comments オプションが有効でなければコメントは使えません。対話シェルでは、 interactive_comments オプションはデフォルトで有効になっています。
クォート
クォート (quoting) を使うと、 特定の文字や単語のシェルに対する特別な意味を取り除けます。 クォートを用いると、特殊文字の特殊な扱いを無効にすることや、 予約語が予約語として識別されることを防いだり、 パラメータの展開を防げます。
前述の 定義 で挙げたメタ文字 (metacharacters) にはそれぞれ特殊な意味があるので、 その文字自身を表すためにはクォートしなければなりません。
コマンド履歴展開機能が使われている場合、履歴の展開を防ぐためには、 履歴展開 (history expansion ) 文字 (普通 ! ) をクォートしなければなりません。
クォートの方法には、 エスケープ文字(escape character) ,シングルクォート、ダブルクォートの 3 種類があります。
クォートされていないバックスラッシュ (\ ) は エスケープ文字 です。エスケープ文字は <newline> という例外を除き、 後に続く文字 1 つの文字としての値を保持させます。 \ <newline> という組合せが現われ、 かつバックスラッシュ自身がクォートされていない場合には、 \ <newline> は行を継続することを表します (つまり、入力ストリームから改行文字が削除され、実質的に無視されます)。
シングルクォートで文字を囲むと、 クォート内部のそれぞれの文字は文字としての値を保持します。 シングルクォートの間にシングルクォートを置くことはできません。 これはバックスラッシュを前に付けても同じです。
ダブルクォートで文字を囲むとクォート内部の全ての文字は文字としての値を 保持しますが、 $ , ` , \ は例外となります。 $ と ` はダブルクォートの内部でも特殊な意味を失いません。 バックスラッシュの場合は、次の文字が $ , ` ," , \ , <newline> のいずれかである場合に限り特殊な意味を失いません。 前にバックスラッシュを付ければ、 ダブルクォート文字をダブルクォートによるクォートの内部で クォートできます。
特殊なパラメータである * と @ は、ダブルクォート内部でも特殊な意味を失いません (後述の パラメータ を参照)。
$
'string
' の形式を持つ単語は特殊な扱いを受けます。
この単語は string
に展開され、
それから ANSI C 標準で仕様が決められている、
バックスラッシュでエスケープされている文字に置き換えられます。
バックスラッシュエスケープシーケンスは、
(もし存在すれば) 以下のようにデコードされます:
- \a
- 警告 (ベル)
- \b
- バックスペース
- \e
- エスケープ文字
- \f
- フォームフィード文字
- \n
- 改行文字
- \r
- 復帰文字
- \t
- 水平タブ文字
- \v
- 垂直タブ文字
- \\
- バックスラッシュ
- \'
- シングルクォート
- \nnn
- ASCII コードの 8 進値が nnn である文字 (1 文字につき数字 3 桁)。
- \xnnn
-
ASCII コードの 16 進値が nnn
である文字 (1 文字につき数字 3 桁)。
展開された結果はシングルクォートされているのと同じ状態で、 ドル記号は存在しなかったかのように扱われます。
ダブルクォートされた文字列の前にドル記号($ )があると、 文字列は現在のロケールに従って変換されます。 現在のロケールが C または POSIX ならば、 ドル記号は無視されます。文字列が変換されたり置換された場合には、 その結果はダブルクォートされているのと同じ状態になります。
パラメータ
パラメータ (parameter) は値を保持するためのものです。パラメータは 名前 、数字、後述の 特殊なパラメータ で挙げる特殊文字のいずれかで表現されます。シェルでの用法においては、 変数(variable) とは 名前 で表現されたパラメータです。
パラメータに値が代入されていれば、 そのパラメータは設定 (set) されていると言われます。 空文字列も有効な値です。一度値を設定すると、組み込みコマンドの unset を使わなければ設定を取り消す (unset する) ことはできません (後述の シェルの組み込みコマンド を参照)。
変数
には、以下の構文で代入できます:
name
=[value
]
value が与えられなかった場合、変数には空文字列が代入されます。全ての value に対して、チルダ展開、パラメータと変数の展開、コマンド置換、 算術式展開、クォート除去が行われます (後述の 展開 を参照)。変数の 整数 属性が設定されている場合 (後述の シェルの組み込みコマンド を参照)、$((...)) の展開を使っていなくても value に対しての算術展開が行われます (後述の 算術式展開 を参照)。 特殊パラメータ で後述する "$@" という例外を除いて、単語の分割は行われません。 パス名展開も実行されません。
位置パラメータ(Positional Parameters)
位置パラメータ (positional parameter) は、1 桁以上の数値で表されるパラメータです。ただし 0 は含みません。 位置パラメータは、シェルが起動されたときにシェルの引き数が代入されますが、 組み込みコマンドの set を使って代入し直すこともできます。 代入文を使って位置パラメータへの代入を行うことはできません。 シェル関数が実行されると、 位置パラメータは一時的に置き換えられます (後述の 関数 を参照)。
2 桁以上の数値を含む位置パラメータを展開するときには、ブレース ({}) で囲まなければなりません (後述の 展開 を参照)。
特殊パラメータ
シェルはいくつかのパラメータを特別扱いします。 このようなパラメータは参照されるだけであり、 値を代入することは許されません。
- *
- (1 から始まる) 全ての位置パラメータに展開されます。 ダブルクォートの内部で展開が行われたときは、 それぞれのパラメータを特別な変数である IFS の最初の文字で区切って並べた 1 つの単語に展開されます。つまり、 "$* " は "$1 c $2 c ... " と同じです。 ここで c は変数 IFS の値の最初の文字です。 IFS が設定されていなければ、パラメータは空白で区切られます。 IFS が空文字列の場合、パラメータの間には区切り文字は入らず、 全てのパラメータは繋げられます。
- @
- (1 から始まる) 全ての位置パラメータに展開されます。 ダブルクォートの内部で展開が行われたときは、 それぞれのパラメータは別々の単語に展開されます。 つまり "$@ " は "$1 " "$2 " ... と同じです。 位置パラメータが無い場合には、"$@ " と $@ を展開しても空文字列になります (つまり取り除かれます)。
- #
- 位置パラメータの個数を示す 10 進値に展開されます。
- ?
- 最後に実行されたフォアグラウンドのパイプラインの 終了ステータスに展開されます。
- -
- 現在のオプションフラグに展開されます。 これは起動の時に指定したり、組み込みコマンド set で設定したり、( -i オプション等で) シェル自身が設定したりします。
- $
- シェルのプロセス ID に展開されます。 () を使ったサブシェルの内部では、$ はサブシェルではなく、 現在のシェルのプロセス ID に展開されます。
- !
- 最後に実行されたバックグラウンド (非同期) コマンドの プロセス ID に展開されます。
- 0
- シェルまたはシェルスクリプトの名前に展開されます。 これはシェルの初期化時に設定されます。 コマンドを記述したファイルを指定して bash を起動した場合、 $0 にはそのファイルの名前が設定されます。 -c オプションを付けて bash を起動した場合、実行する文字列の後に引き数があれば、その最初の値が $0 に設定されます。このオプションを指定していない場合には、 bash を起動する時に使用した名前が引き数 0 として与えられ $0 に設定されます。
- _
- シェルの起動時には、引き数リストで渡された、 実行するシェルまたはシェルスクリプトの絶対ファイル名が設定されます。 その後は、前のコマンドに対する最後の引き数 (展開後のもの) に展開されます。 また、実行する各コマンドの完全なファイル名が設定され、 そのコマンドの環境にエクスポートされます。 メールをチェックするときには、 このパラメータは現在チェックしているメールのファイル名を保持します。
シェル変数
以下の変数はシェルが設定します:
- PPID
- そのシェルの親のプロセス ID。この変数は読み込み専用です。
- PWD
- cd コマンドで設定された現在の作業ディレクトリ。
- OLDPWD
- cd コマンドで設定された、1 つ前の作業ディレクトリ。
- REPLY
- 組み込みコマンド read に引き数が与えられなかった時に読み込まれた行が設定されます。
- UID
- 現在のユーザのユーザ ID に展開されます。 初期化はシェルの起動時に行われます。 この変数は読み込み専用です。
- EUID
- 現在のユーザの実効ユーザ ID に展開されます。 初期化はシェルの起動時に行われます。 この変数は読み込み専用です。
- GROUPS
- 現在のユーザがメンバになっているグループのリストを含んだ配列変数です。 GROUPS への代入は効果がなく、エラーステータスを返します。 GROUPS が unset された場合はこの変数の特殊な性質はなくなります。 その後に再設定されたとしても元に戻りません。
- BASH
- 現在実行している bash を起動したときに使われた、完全なファイル名に展開されます。
- BASH_VERSION
- 現在実行している bash のバージョンを示す文字列に展開されます。
- BASH_VERSINFO
-
読み込み専用の配列変数で、配列の各要素は現在実行されている
bash
のバージョン情報を持っています。
配列変数の要素に代入される内容を以下に示します:
- BASH_VERSINFO[ 0]
- メジャーバージョン番号 (リリース )。
- BASH_VERSINFO[ 1]
- マイナーバージョン番号 (バージョン )。
- BASH_VERSINFO[ 2]
- パッチレベル。
- BASH_VERSINFO[ 3]
- ビルドバージョン。
- BASH_VERSINFO[ 4]
- リリースステータス (beta1 など)。
- BASH_VERSINFO[ 5]
-
MACHTYPE
の値。
- SHLVL
- bash の実体が起動されるたびに 1 ずつ増えます。
- RANDOM
- このパラメータが参照される度に、 0 から 32767 までのランダムな整数が生成されます。 RANDOM に値を代入すると、乱数の列を初期化できます。 RANDOM を unset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。
- SECONDS
- このパラメータを参照すると、シェルが起動されてからの秒数が返されます。 SECONDS に値を代入した場合、それ以降の参照において返される値は、 代入された値と代入以降の秒数を足した値になります。 SECONDS を unset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。
- LINENO
- この変数が参照されると、 シェルはスクリプトや関数における現在の行番号 (1から始まります) を表す 10 進値を代入します。スクリプトや関数の内部でない場合には、 意味のある値が代入されることは保証されません。 LINENO を unset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。
- HISTCMD
- 現在のコマンドの履歴番号 (履歴リストにおけるインデックス) です。 HISTCMD を unset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。
- FUNCNAME
- 現在実行中のシェル関数の名前です。 この変数はシェル関数を実行している間のみ存在します。 FUNCNAME への代入は効果がなく、エラーステータスを返します。 FUNCNAME を unset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。
- DIRSTACK
- 現在のディレクトリスタックの内容を持つ配列変数 (後述の 配列 を参照) です。組み込みコマンド dirs を使うと、スタック中のディレクトリがスタック順に表示されます。 配列変数の要素に代入を行うと、 既にスタックに入っているディレクトリを変更できますが、 ディレクトリの追加と削除を行うためには、組み込みコマンドの pushd と popd を使わなければなりません。 この変数に代入を行っても現在の作業ディレクトリは変わりません。 DIRSTACK を unset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。
- PIPESTATUS
- フォアグラウンドのパイプラインで最後に実行されたプロセスの 終了ステータスのリストを含む配列変数です (後述の 配列 を参照)。
- OPTARG
- 組み込みコマンド getopts で処理した最後のオプション引き数の値です (後述の シェルの組み込みコマンド を参照)。
- OPTIND
- 組み込みコマンド getopts で次に処理されるオプション引き数のインデックスです (後述の シェルの組み込みコマンド を参照)。
- HOSTNAME
- 現在のホスト名が自動的に設定されます。
- HOSTTYPE
- bash を実行するマシンの種類をユニークに記述する文字列が自動的に設定されます。 デフォルト値はシステム依存です。
- OSTYPE
- bash を実行するオペレーティングシステムを記述する文字列が自動的に設定されます。 デフォルト値はシステム依存です。
- MACHTYPE
- bash を実行するシステムの種類を完全に指定する文字列が、 GNU 標準の cpu-company-system の形式で設定されます。 デフォルト値はシステム依存です。
- SHELLOPTS
- コロン区切りのリストで、有効になっているシェルのオプションを示します。 リスト中のそれぞれの単語は、組み込みコマンド set の -o オプション (後述の シェルの組み込みコマンド を参照) に対する有効な引き数になっています。 SHELLOPTS に入っているオプションは、set -o を実行した場合にも on であると報告されます。 この変数が bash の起動時に環境変数に入っていた場合、 どの起動ファイルを読むよりも前にリスト中のシェルオプションが有効になります。 この変数は読み込み専用です。
- COMP_WORDS
- 現在のコマンドラインの各単語からなる配列変数 (後述の 配列 参照) です。 この変数はプログラム補完機能 (後述の プログラム補完 を参照) から呼ばれたシェル関数においてのみ有効です。
- COMP_CWORD
- 現在カーソル位置が置かれている単語の ${COMP_WORDS} におけるインデックスです。 この変数はプログラム補完機能 (後述の プログラム補完 を参照) から呼ばれたシェル関数においてのみ有効です。
- COMP_LINE
- 現在のコマンドラインです。 この変数はプログラム補完機能 (後述の プログラム補完 を参照) から呼ばれたシェル関数においてのみ有効です。
- COMP_POINT
-
現在のコマンドの先頭からの相対値として与えられた
カーソル位置のインデックスです。
現在のカーソル位置が現在の現在のコマンドの最後にある場合、
この変数の値は ${#COMP_LINE}
と等しくなります。
この変数はプログラム補完機能 (後述の プログラム補完
を参照)
から呼ばれたシェル関数においてのみ有効です。
以下の変数はシェルが使用します。場合によっては、 bash がデフォルト値を変数に代入します。このような場合については後述します。
- IFS
- 内部フィールド区切り文字 (Internal Field Separator) です。展開を行った後に単語を分割する場合や、組み込みコマンドの read を使った時に行を単語に分割する場合に使われます。 デフォルト値は ``<空白><タブ><改行>'' です。
- PATH
- コマンドの検索パスです。 シェルがコマンドを検索するディレクトリをコロンで区切って並べたリストです (後述の コマンドの実行 を参照)。デフォルトのパスはシステム依存で、 bash をインストールしたシステム管理者が設定します。 一般的な値は /usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.です。
- HOME
- 現在のユーザのホームディレクトリです。 組み込みコマンド cd のデフォルトの引き数になります。 この変数の値は、チルダ展開を実行するときにも使われます。
- CDPATH
- cd コマンドの検索パスです。これは、 cd コマンドで指定した対象ディレクトリを探すディレクトリを コロンで区切って並べたリストです。 例えば、``.:~:/usr'' といった値になります。
- BASH_ENV
- bash がシェルスクリプトを実行する時にこの値が設定されている場合、 この値は ( ~/.bashrc のように) シェルを初期化するコマンドが書かれているファイル名と解釈されます。 BASH_ENV の値をファイル名として処理する前には、パラメータ展開、コマンド置換、 算術的展開が行われます。 この結果のファイルを検索する際には PATH は使用されません。
- このパラメータにファイル名が設定されており、かつ変数 MAILPATH が設定されていなければ、 bash は指定されたファイルへのメールの到着をユーザに通知します。
- MAILCHECK
- bash がメールをチェックする頻度を (秒数で) 指定します。 デフォルト値は 60 秒です。 メールをチェックする時間になると、 シェルはプライマリのプロンプトを表示する前にチェックを行います。 この変数が unset された場合、 あるいはこの変数に 0 より大きい数値以外が代入された場合は、 シェルはメールのチェックを行いません。
- MAILPATH
-
メールのチェックに使うファイル名をコロンで区切って並べたリストです。
特定のファイルにメールが到着したときに出力される
メッセージは、`?' を使ってファイル名をメッセージから区切ることによって
指定できます。メッセージのテキスト中で使われたときは、
$_
は現在のメールファイルの名前に展開されます。
設定例:
MAILPATH ='/var/mail/bfox?"You have mail":~/shell-mail?"$_ has mail!"'
この変数のデフォルト値は bash が与えますが、 bash が使うユーザのメールファイルの位置はシステム依存です (/var/mail/$USER 等)。
- PS1
- このパラメータの値は展開されてプライマリのプロンプト文字列として使われます。 (後述の プロンプト を参照)、 デフォルト値は ``\s-\v\$ '' です。
- PS2
- このパラメータの値は PS1 と同じように展開され、セカンダリのプロンプト文字列として使われます。 デフォルト値は ``> '' です。
- PS3
- このパラメータの値は select コマンド (前述の シェルの文法 を参照) のプロンプトとして使われます。
- PS4
- このパラメータは PS1 と同じように展開されます。この値は実行トレース中に bash が表示する各コマンド前に出力されます。 複数段の間接レベル (levels of indirection) を示すときは、 PS4 の最初の文字が必要に応じて複数回表示されます。 デフォルト値は ``+ '' です。
- TIMEFORMAT
-
このパラメータの値は、予約語である
time
が先頭に付いているパイプラインに対して、
時間情報の表示の仕方を指定するフォーマット文字列として使われます。
%
は、時間の値などに展開される
エスケープシーケンスを示すための文字です。
エスケープシーケンスとその意味を以下に示します。
ただし、ブレース ([]) は省略可能であることを表しま
す。
- %%
- % 文字そのもの。
- %[p ][l]R
- 経過した秒数。
- %[p ][l]U
- ユーザモードで使われた CPU の秒数。
- %[p ][l]S
- システムモードで使われた CPU の秒数。
- %P
-
CPU のパーセンテージ。(%U + %S) / %R で算出されます。
p 省略可能で、精度 (precision) が何桁であるかを指定します。 つまり小数点以下の桁数を指定します。この値が 0 ならば、 小数点や小数の部分は出力されません。 また、小数点以下で指定できるのは 3 桁までです。 つまり、p の値が 3 より大きければ 3 に変更されます。 p を指定しなければ、この値は 3 となります。
l は省略可能ですが、指定すると、分を含み、 MM mSS .FF という形式の長いフォーマットになります。 小数を含むかどうかは p の値によって決まります。
この変数が設定されていなければ、 bash は $'\nreal\t%3lR\nuser\t%3lU\nsys%3lS' という値が指定されているかのように動作します。 この値が空文字列ならば、時間の情報は表示されません。 フォーマット文字列の表示の際には、末尾に改行文字が追加されます。 - HISTSIZE
- コマンド履歴に記憶するコマンドの数 (後述の HISTORY を参照)。
- HISTFILE
- コマンド履歴が保存されるファイルの名前 (後述の 履歴 を参照)。デフォルト値は ~/.bash_history です。 設定されていない場合、 対話シェルが終了する時に履歴の保存が行われません。
- HISTFILESIZE
- 履歴ファイルに保持する履歴の最大数です。この変数に値が代入された場合、 その行数を越えないように、必要に応じて履歴ファイルが切り詰められます。 デフォルト値は 500 です。対話シェルが終了する時にも、 履歴ファイルのサイズはファイル書き込みの後にこのサイズに切り詰められます。
- OPTERR
- 値として 1 が設定されている場合、 bash は組み込みコマンド getopts (後述の シェルの組み込みコマンド を参照) を使って生成したエラーメッセージを表示します。 シェルが起動されたり、シェルスクリプトが実行される度に、 OPTERR は 1 に初期化されます。
- LANG
- LC_ で始まる変数で特に選択されない任意のカテゴリに対して、 ロケールのカテゴリを決めるために使います。
- LC_ALL
- この変数はロケールのカテゴリを指定する LC_ 変数と LANG の 値を全て上書きします。
- LC_COLLATE
- この変数はパス名展開の結果をソートするときに使用される照合順序と、 パス名展開とパターンマッチングにおける 範囲展開、同値クラス、照合シーケンスの動作決定します。
- LC_CTYPE
- この変数は、パス名展開とパターンマッチングにおける 文字の解釈と文字クラスの挙動を決めます。
- LC_MESSAGES
- この変数は、$ の後に続くダブルクォートされた文字列の 翻訳に使うロケールを決めます。
- LC_NUMERIC
- この変数は数字のフォーマットに使用するロケールカテゴリを決定します。
- LINES
- 組み込みコマンド select によって、選択されたリストを表示する際の行数の決定に用いられます。 SIGWINCH を受信すると自動的に設定されます。
- COLUMNS
- 組み込みコマンド select によって、選択されたリストを表示する際の端末幅の決定に用いられます。 SIGWINCH を受信すると自動的に設定されます。 PROMPT_COMMAND 設定されていると、プライマリプロンプトを出す前に毎回、 この値がコマンドとして実行されます。
- IGNOREEOF
- 単独で入力された EOF 文字を受け取ったときの対話シェルの動作を制御します。 この変数が設定されていれば、指定されている値の数だけの EOF 文字を連続して行頭の文字として入力しなければ bash は終了しません。この変数に数値以外の値が設定されている場合や、 値が設定されていない場合には、デフォルト値として 10 が使われます。 この変数が存在しなければ、 EOF 文字はシェルへの入力の終わりを示します。
- TMOUT
- 0 より大きい値が設定されていると、 この値はプライマリプロンプトを出した後に入力を待つ秒数として解釈されます。 この秒数だけ待った時点で入力が無ければ bash は終了します。
- FCEDIT
- 組み込みコマンド fc が使うデフォルトのエディタです。
- FIGNORE
- ファイル名補完 (後述の READLINE を参照) を行う際に無視するサフィックスを コロンで区切って並べたリストです。 FIGNORE のエントリのいずれかにサフィックスがマッチするファイル名は、 ファイル名補完にマッチするファイルのリストから除外されます。 例えば値として ``.o:~'' を設定します。
- GLOBIGNORE
- パス名展開で無視するファイル名の集合を定義するパターンを コロンで区切って並べたリストです。 パス名展開パターンにマッチするファイル名が GLOBIGNORE 内のパターンのどれかにもマッチする場合、 これはマッチしたもののリストから削除されます。
- INPUTRC
- readline の起動ファイルのファイル名です。これはデフォルト値の (後述の READLINE を参照) を上書きします。
- HISTCONTROL
- ignorespace の値が設定されていると、 空白 文字で始まる行は履歴リストに入りません。 ignoredups の値が設定されていると、 履歴の最後の行にマッチする行は履歴リストに入りません。 ignoreboth の値はこれらの 2 つのオプションを同時に実現します。 設定されていないか上記のいずれの値でもない場合には、 パーザが読み込んだ全ての行は HISTIGNORE の値が示す条件の下で履歴リストに保存されます。 この変数は既に古くなっており、この機能は HISTIGNORE 変数で用いることになっています。 複数行にまたがる複雑なコマンドの場合は 2 番目以降の行が調べられることはありません。よって、これらは HISTCONTROL の値に関わらず履歴に追加されます。
- HISTIGNORE
- どのコマンド行を履歴リストに保存するかを決めるために使うパターンを コロンで区切って並べたリストです。 それぞれのパターンは行の先頭と比較され、 行全体が完全に一致しなければなりません (`* ' が暗黙的に追加されるこ とはありません)。各パターンの評価は HISTCONTROL で指定したチェックが行われた後の行に対して実行されます。 通常のシェルのパターンマッチング文字以外に、 `& ' が履歴の前の行にマッチします。 バックスラッシュを使って `& ' をエスケープできます。 マッチングを試みる前にバックスラッシュは取り除かれます。 複数行にまたがる複雑なコマンドの場合、2 番目以降の行は調べられません。 よって、これらは HISTIGNORE の値に関わらず履歴に追加されます。
- histchars
- 2 文字または 3 文字で、 履歴の展開とトークン分割 (後述の 履歴展開 を参照) を制御します。 最初の文字は 履歴展開 (history expansion) 文字であり、 履歴展開の先頭を示す文字です。通常、これは `! ' です。 2 番目の文字は 簡易置換 (quick substitution) 文字であり、前に入力したコマンドの文字列を 別の文字列に置き換えて再実行を行うための省略表現として使います。 デフォルト値は `^ ' です。 3 番目の文字は省略可能です。単語の先頭でこの文字が見つかると、 行の残りの部分がコメントとなるような文字を指定します。 これは通常は `# ' です。 履歴コメント文字があると、 その行の残りの単語に対する履歴置換はスキップされます。 この文字があるからといって、 必ずしもシェルのパーザが行の残りの部分をコメントとして扱うわけではありません。
- HOSTFILE
- と同じフォーマットであり、 シェルがホスト名を補完する必要があるときに読み込むファイルの名前を示します。 シェルの実行中でも補完するホスト名のリストを変更できます。 この変数が変更された次の機会にホスト名の補完を試みるとき、 bash は新しいファイルの内容を既存のデータベースに追加します。 HOSTFILE が設定されているがその値が空文字列の場合、 bash は補完可能なホスト名のリストを取得するために を使用します。 HOSTFILE が unset された場合は、ホスト名のリストはクリアされます。
- auto_resume
- この変数はシェルがユーザとジョブ制御の相互作用をどのように扱うかを決めます。 この変数を設定した場合、1 語からなるリダイレクト無しの単純なコマンドが、 停止中ジョブの実行再開候補として扱われます。 曖昧な指定は許されません。 入力された文字列で始まるジョブが複数ある場合には、 最後にアクセスされたものが選ばれます。 ここでの 名前 とは、コマンドを起動する際に使ったコマンドラインのことです。 この値に exact が設定されている場合、 与えられた文字列は停止しているジョブの名前に 正確にマッチしなければなりません。 substring が設定されている場合は、 与えられた文字列は停止しているジョブの名前の部分文字列に マッチする必要があります。 substring という値は、ジョブ識別子の %? に似た機能を持っています (後述の ジョブ制御 を参照)。これ以外の値が設定されている場合、 与えられた文字列は停止しているジョブの名前の プレフィックスでなければなりません。これはジョブ識別子の % と似た機能を持っています。
- COMPREPLY
- bash が可能な補完候補を読み込む配列変数です。 この値はプログラム補完機能 (後述の プログラム補完 を参照) によって呼び出されたシェル関数によって生成されます。
配列
bash は 1 次元の配列変数を扱うことができます。 全ての変数は配列として使用できます。 declare 組み込みコマンドを使えば、明示的に配列を宣言できます。 配列のサイズの上限はありませんし、 メンバのインデックス付けや代入を 連続的にしなければならないという条件もありません。 配列のインデックス付けは 0 から始まる整数を用いて行います。
変数の代入の際に name [subscript ]=value という記法が使われた場合、配列は自動的に生成されます。 subscript は算術式として扱われますが、この式は評価すると 0 以上の数値になるものでなければなりません。 明示的に配列を宣言するには、 declare -a name を使います (後述の シェルの組み込みコマンド を参照)。 declare -a name [subscript ]も許されます。subscript は無視されます。 組み込みコマンドの declare と readonly を使うと、配列変数に対して属性を設定できます。 どちらの属性も配列のメンバ全てに対して適用されます。
配列の代入は name =( value1 ... valuen ) という形式の複合代入 (compound assignment) を用いて行います。 ここでそれぞれの value の形式は [subscript ]=string です。 必要なのは string だけです。 ブラケット([])と添字を省略しなかった場合、 そのインデックスに対して代入が行われます。 省略した場合には、代入される要素のインデックスは、 その文の中で直前に代入されたインデックスに 1 を加えたものになります。 インデックスは 0 から始まります。 この記法は組み込みコマンド declare でも使えます。個別の配列要素に対する代入は、先に説明した name [subscript ]=value の記法を使って行います。
配列の任意の要素は、${name [subscript ]} を使って参照できます。 パス名展開との衝突を避けるためにブレースが必要です。 添字(subscript) が @ か * ならば、その単語は name の全ての要素に展開されます。これらの添字が異なるのは、 単語がダブルクォートの内部にある場合だけです。 単語がダブルクォートされていれば、${name } は 1 つの単語に展開されます。 この単語は、配列の各メンバの値を特殊変数 IFS の値で区切って並べたものです。${name [@]}は、 name の各要素を別々の単語に展開します。 配列のメンバが全く無いときは、${name [@]} は空の単語に展開されます。 これは特殊パラメータ * や @ に似ています (前述の 特殊パラメータ を参照)。${#name [subscript ]} は ${name [subscript ]} の長さに展開されます。 subscript が * または @ の場合は、 配列中の要素数に展開されます。添字無しで配列変数を参照すると、 要素 0 を参照したことになります。
組み込みコマンドの unset は配列の破棄に使われます。unset name [subscript ] とすると、インデックスが subscript である配列の要素が破棄されます。 unset name (name は配列) または unset name [subscript ] (subscript が * または @ ) とすると、 配列全体が破棄されます。
組み込みコマンドの declare , local , readonly いずれにおいても、 -a オプションで配列を指定できます。組み込みコマンド read では、 -a オプションを使えば標準入力から読み込んだ単語のリストを 配列に代入できます。組み込みコマンド set と declare では、別の変数への代入に再利用できるような形で配列の値を表示します。
展開
展開はコマンドラインが単語へ分割された後に (コマンドライン上で) 行われます。行われる展開は 7 種類あります: ブレースの展開 (brace expansion) , チルダの展開 (tilde expansion) , パラメータと変数の展開 (parameter and variable expansion) , コマンド置換 (command substitution) , 算術式展開 (arithmetic expansion) , 単語の分割 (word splitting) , パス名の展開 (pathname expansion) 。
展開の順序は次のようになります: ブレース展開、チルダ展開、パラメータ・ 変数・算術式展開、コマンド置換 (左から右へ)、単語分割、パス名展開。
これらに加えて プロセス置換 (process substitution) をサポートできるシステムもあります。
展開した部分の単語の数が変化することがあるのは、ブレース展開、 単語の分割、パス名展開だけです。他の展開では、 1 つの単語は 1 つの単語に展開されます。 この規則の唯一の例外は先に説明した "$@ " と "${ name [@]} " の展開 ( パラメータ を参照) だけです。
ブレース展開
"ブレース展開 (brace expansion)" を使うと、任意の文字列を生成できます。この機構は パス名展開 に似ていますが、 生成されたファイル名が実在する必要はありません。 ブレース展開されるパターンは、 前置部分 (preamble: 省略可能) 、対になるブレースの間にコンマで区切って並べた文字列、 後置部分 (postscript: 省略可能) を順に並べたものです。 前置部分はブレース内にある文字列それぞれの先頭部分に追加され、 後置部分は左から右に順に展開されて得られた それぞれの文字列の末尾に追加されます。
ブレースの展開は入れ子にできます。 展開して得られた文字列はソートされず、 左から右への順番がそのまま残ります。 例えば a{ d,c,b} e は `ade ace abe' と展開されます。
ブレースの展開は他のどの展開よりも前に実行されます。 また、他の展開において特殊な意味を持つ文字もそのまま結果に残ります。 つまり、厳密にテキスト操作だけを行います。 bash は、展開の文脈やブレースの間のテキストに対して 文法的な解釈を適用することは一切ありません。
正しい形のブレース展開には、クォートされていない開きブレースと 閉じブレース、また少なくとも 1 つのクォートされていないコンマが 含まれていなければなりません。正しい形でないブレース展開は全て、 変更されないでそのまま残ります。 { や , をバックスラッシュでクォートすれば、 ブレース展開の一部と解釈されないようにできます。 パラメータ展開との衝突を避けるため、文字列 ${ はブレース展開の対象とは解釈されません。
この仕組みは、
生成される文字列の共通先頭部分が上記の例より長い場合に、
短縮表現としてよく使用されます:
mkdir /usr/local/src/bash/{old,new,dist,bugs}
あるいは
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
ブレース展開の導入によって、伝統的な sh とは少し非互換になった部分があります。 sh は単語の一部として開きブレースや閉じブレースが現われても特別扱いはせず、 そのまま出力に残します。 bash はブレース展開の結果として単語からブレースを取り除きます。例えば sh に file{1,2} のように入力された単語はそのままの形で出力されますが、 bash ではこの同じ単語は展開されて file1 file2 のように出力されます。 厳密に sh と互換にしたければ、 bash を +B オプションを付けて起動するか、 set コマンドに +B オプションを与えてブレース展開を無効にしてください (後述する シェル組み込みコマンド を参照)。
チルダ展開
クォートされていないチルダ (`~ ') で単語が始まった場合、 クォートされていないスラッシュよりも前にある文字すべて (クォートされていないスラッシュが無ければすべての文字) はチルダプレフィックス (tilde-prefix ) と解釈されます。 クォートされている文字がチルダプレフィックス中に無ければ、 チルダプレフィックス中のチルダ以降の文字は、 ログイン名 (login name) になる可能性がある文字列として扱われます。 このログイン名が空文字列ならば、チルダはシェルパラメータ HOME の値に置き換えられます。 HOME が設定されていない場合は、代わりにシェルを実行しているユーザの ホームディレクトリに置き換えられます。 ログイン名が空でなければ、 チルダプレフィックスは指定されたログイン名に対応する ホームディレクトリに置き換えられます。
チルダプレフィックスが `~+' ならば、チルダプレフィックスはシェル変数 PWD の値に置き換えられます。 チルダプレフィックスが `~-' ならば、シェル変数 OLDPWD の値に置き換えられます (値が設定されていれば)。 チルダプレフィックス中のチルダより後の文字が数値 N であれば (数値の前に `+' や `-' を置くこともできます)、 チルダプレフィックスはディレクトリスタック内の対応する要素に置換されます。 置換される要素は、チルダプレフィックスを引き数として組み込みコマンド dirs を実行したときに表示されるものです。 チルダプレフィックスにおけるチルダ以降の文字が、 先行する `+' や `-' のない数値である場合は、`+' であるとみなされます。
ログイン名が有効でない場合や、チルダ展開が失敗した場合には、 単語は置き換えられません。
全ての変数代入において、 : や = の直後にクォートされていないチルダプレフィックスがないかチェックが行われます。 もし見つかった場合にはこれらもチルダ展開されます。 したがって、 PATH , MAILPATH , CDPATH への代入にチルダを含むファイル名を使えば、 シェルは展開された値を代入します。
パラメータの展開
`$ ' 文字があると、パラメータ展開、コマンド置換、 算術式展開が行われます。展開されるパラメータ名やシンボルは、 ブレースで括ることもできます。 ブレースは省略可能ですが、 変数の直後に変数名の一部と解釈できる文字が置かれた場合に、 その文字と共に変数が展開されてしまうのを防ぐために用意されています。
ブレースを使った場合、マッチングを終えるブレースは最初の `} ' です。 ただしバックスラッシュでエスケープされているものや クォートされている文字列中のものは含まれませんし、 算術式展開やコマンド置換、パラメータ展開に入っているものも含まれません。
- ${parameter }
-
parameter
の値が置換されます。ブレースが必要になるのは、
parameter
が 2 桁以上の数字を持つ位置パラメータの場合や、
parameter
の直後の文字を名前の一部として解釈させたくない場合です。
parameter の最初の文字が感嘆符である場合、間接変数レベル (level of variable indirection) という概念が導入されます。 bash は、展開に parameter そのものの値を使用するのでなく、 parameter の感嘆符を除いた残りの文字を変数名として扱い、 その変数の値をその後の展開に使用します。 これが間接展開 (indirect expansion) と呼ばれるものです。 ただし ${!prefix *} の展開は例外です。これは以下で説明します。
以下に示すそれぞれの場合、word に対してチルダ展開、 パラメータ展開、コマンド置換、算術式展開が行われます。 部分文字列展開以外の場合、 bash はパラメータが設定されているか、空ではないかを調べます。 コロンを省略した場合には設定されているかどうかのみを調べます。
- ${parameter :- word }
- デフォルトの値を使います 。 parameter が設定されていないか空文字列であれば、 word を展開したものに置換されます。そうでなければ、 parameter の値に置換されます。
- ${parameter := word }
- デフォルトの値を代入します 。 parameter が設定されていないか空文字列であれば、 word を展開したものが parameter に代入されます。それから parameter の値への置換が行われます。 位置パラメータや特殊パラメータへの代入をこのように行うことはできません。
- ${parameter :? word }
- 空文字列または設定されていない場合にエラーを表示します 。 parameter が空文字列または設定されていない場合、word を展開したもの ( word がなければ パラメータが空文字列または設定されていないことを示すメッセージ) が標準エラー出力に出力されます。シェルが対話的でなければ、 シェルは終了します。パラメータに空文字列以外が設定されていれば、 parameter の値への置換が行われます。
- ${parameter :+ word }
- 別の値を使用します 。 parameter が空文字列または設定されていなければ、空文字列に置換されます。 そうでなければ word を展開したものに置換されます。
- ${parameter : offset }
- ${parameter : offset : length }
- 部分文字列展開 。 parameter を展開したものから最大 length 文字を取り出します。 先頭の文字は offset で指定します。length を省略すると、 offset で指定した文字を先頭にして、 parameter の残り全部が含まれる部分文字列に展開します。 length と offset は算術式です (後述の 算術式評価 を参照)。 length の評価結果は 0 以上の数でなければなりません。 offset を評価すると 0 未満の数になる場合、この値は parameter の値の末尾からのオフセットとして使われます。 parameter が @ ならば、結果は offset から始まる length 個の位置パラメータになります。 parameter が @ または * のインデックスが付いている配列名ならば、 結果は配列の ${parameter [offset ]} を先頭とする要素 length 個となります。位置パラメータを使う場合以外は、 部分文字列のインデックスは 0 から始まります。位置パラメータの場合には、 インデックスは 1 から始まります。
- ${! prefix * }
- prefix で始まるすべての変数の名前に展開して、 IFS 特殊変数の最初の文字によって区切ります。
- ${# parameter }
- parameter の値に含まれる文字数に置換されます。 parameter が * または @ ならば、位置パラメータの数に置換されます。 parameter が * または @ が添字になっている配列名ならば、配列中の要素数に置換されます。
- ${parameter # word }
- ${parameter ## word }
- word が展開され、パス名展開の場合と同じようなパターンを作ります。 このパターンが parameter の値の先頭部分とマッチする場合、展開して得られる値は parameter を展開した値から最短一致パターン (``# ''の場合) または最長一致パターン (``## '' の場合) を取り除いたものになります。 parameter が @ または * である場合、 パターンを削除する操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter が @ または * が添字になっている配列変数である場合、 パターンを削除する操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。
- ${parameter % word }
- ${parameter %% word }
- word が展開され、パス名展開の場合と同じようなパターンを作ります。 このパターンが parameter を展開した値の末尾の部分とマッチする場合、展開結果は parameter を展開した値から最短一致パターン (``% '' の場合) または最長一致パターン (``%% '' の場合) を取り除いたものになります。 parameter が @ または * である場合、 パターンを削除する操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter が @ または * が添字になっている配列変数である場合、 パターンを削除する操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。
- ${parameter / pattern / string }
- ${parameter // pattern / string }
- pattern が展開され、 パス名展開の場合と同じようなパターンを作ります。 parameter の展開が行われ、 その値のうち pattern に最長一致する部分が string に置換されます。 前者の形式の場合には、最初にマッチした部分だけが置換されます。 後者の形式の場合には、マッチした部分は全て string に置換されます。 pattern が # で始まる場合には、パターンは parameter を展開した値の先頭にマッチしなければなりません。 pattern が % で始まる場合には、パターンは parameter を展開した値の末尾にマッチしなければなりません。 string が空の場合には pattern にマッチした部分は削除されます。 またこの場合には、pattern の後に続く / は省略可能です。 parameter が @ または * である場合、置換操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter が @ または * が添字になっている配列変数である場合、 置換操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。
コマンド置換
コマンド置換 (command substitution) を用いると、 コマンド名をコマンドの出力で置き換えできます。 コマンド置換には以下の 2 つの形式があります:
$(
command
)
または
`
command
`
bash による展開は、command の実行およびコマンド置換の部分を コマンドの標準出力と置換することにより実行されます。 この際、末尾の改行文字は削除されます。 文字列の途中にある改行文字は削除されませんが、 単語分割の際に削除されることがあります。 コマンド置換 $(cat file ) は、同じ意味を持ち、 しかも高速な $(< file ) に置き換え可能です。
バッククォートを使う古い形式の置換を用いたとき、 バックスラッシュは文字通りの意味を保ちますが、 $ , ` , \ の前にある場合は例外となります。 バックスラッシュが前置されていないバッククォートがあると、 そこでコマンド置換は閉じられます。 $(command ) という形式を用いたときは、 括弧の間にある全ての文字がコマンドとなります。 特別扱いされる文字はありません。
コマンド置換は入れ子にできます。 バッククォート形式の時に入れ子を行うには、 内側のバッククォートをバックスラッシュでエスケープします。
置換がダブルクォート内部にある場合には、 置換の結果に対する単語分割とパス名展開は行われません。
算術式展開
算術式展開を使うと、算術式を評価して、その結果に置換できます。
算術式展開のフォーマットを次に示します:
$((
expression
))
expression はダブルクォート内部にある場合と同様に扱われますが、 括弧の内側のダブルクォートが特別扱いされることはありません。 式に含まれる全てのトークンに対して、 パラメータ展開・文字列展開・コマンド置換・クォートの削除が行われます。 算術式置換は入れ子にできます。
評価は後述の "算術式評価" で示す規則に基づいて行われます。 expression が不正であれば、 bash は評価の失敗を示すメッセージを出力し、置換を全く行いません。
プロセス置換
プロセス置換 (process substitution) がサポートされるのは、 名前付きパイプ (FIFO ) または名前付きオープンファイルの /dev/fd メソッドをサポートしているシステムです。これは <( list ) または >( list ) の形になります。 プロセス list は、その入力や出力が FIFO または /dev/fd 中の 何らかのファイルに接続された状態で実行されます。 このファイルの名前は、展開の結果として、 引き数のかたちで現在のコマンドに渡されます。 >( list ) の形式を使った場合、 ファイルへの書き込みは list への入力となります。 <( list ) の形式を使った場合、 引き数として渡されたファイルは list の出力を得るために読み込まれます。
利用可能であれば、プロセス置換 (process substitution) は、 パラメータ展開・変数展開・コマンド置換・算術式展開と同時に行われます。
単語の分割
シェルはパラメータ展開・コマンド置換・算術式展開 (ダブルクォートの内部ではこれらの展開は行われません) の結果をスキャンし、 "単語分割" を行います。 シェルは IFS のそれぞれの文字を区切り文字として扱い、 他の展開の結果をこれらの文字によって単語に分割します。 IFS が設定されていないか、その値が正確にデフォルト値の <スペース><タブ><改行> ならば、 IFS 文字の任意の列で単語が区切られます。 IFS がデフォルト以外の値を持っていれば、空白文字 ( スペース および タブ )の列は単語の先頭と末尾では無視されます。これは空白文字が IFS の値 ( IFS 空白文字) に含まれる限り成り立ちます。 IFS に含まれ、 IFS 空白文字ではない文字は全て、隣接する任意の IFS 空白文字と一緒になってフィールドの区切りとなります。 IFS 空白文字の列も区切り文字として扱われます。 IFS の値が空文字列であれば、単語分割は全く行われません。
明示的に指定した空の引き数(3"" または 3'')は削除されずに残ります。 クォートされていない暗黙的な空の引き数が、 値を持たないパラメータを展開した結果として得られますが、 これらは削除されます。 値を持たないパラメータがダブルクォート内部で展開されると、 これは空である引き数となり、消されずに残ります。
展開が行われなければ単語分割も行われない点に注意してください。
パス名展開
-f オプションが指定されていなければ、単語分割を行った後に bash はそれぞれの単語が * , ? , [ を含んでいるかどうか調べます。 これらの文字のいずれかが見つかると、その単語は パターン と見なされ、 パターンにマッチするファイル名を アルファベット順にソートしたリストに置換されます。 マッチするファイル名が見つからず、かつシェルのオプション nullglob が無効ならば、その単語は変更されずにそのまま残ります。 nullglob オプションが設定されていて、かつマッチするファイル名が見つからなければ、 その単語は削除されます。 シェルのオプション nocaseglob が有効ならば、マッチングにおいてアルファベットの大文字と小文字は区別さ れません。 パターンをパス名展開に使うとき、名前の先頭やスラッシュの直後の ``.'' は明示的にマッチさせなければなりません。ただしシェルのオプション dotglob が設定されている場合は例外です。 パス名のマッチングを行うとき、 スラッシュ文字は必ず明示的にマッチさせなければなりません。 これ以外の場合には、 ``.'' が特別扱いされることはありません。 シェルのオプション nocaseglob , nullglob , dotglob の詳しい説明については、後述の シェルの組み込みコマンド に書かれている shopt の説明を参照してください。
シェル変数 GLOBIGNORE を使って、 パターン にマッチするファイル名の集合を制限できます。 GLOBIGNORE が設定されていれば、マッチするファイル名のうち GLOBIGNORE 中のパターンにもマッチしたものは、 マッチしたもののリストから取り除かれます。 ファイル名 ``.'' と ``..'' は必ず無視されます。これは GLOBIGNORE が設定されていても同じです。しかし、 GLOBIGNORE を設定するとシェルオプションの dotglob が有効になるので、 ``.'' で始まる他のファイル名は全てマッチします。 ``.'' で始めるファイル名を無視する古い動作をさせるには、 ``.*'' を GLOBIGNORE のパターンに含めてください。 GLOBIGNORE が設定されていなければ、 dotglob オプションは無効になります。
パターンマッチング
パターンに含まれる文字のうち、後述する特殊パターン文字以外の文字は、 自分自身にマッチします。NUL 文字がパターン中に現われてはいけません。 特殊パターン文字をその文字そのものにマッチさせるためには、 クォートしなければなりません。
特殊パターン文字は以下の意味を持っています:
- *
- 空文字列を含む、任意の文字列にマッチします。
- ?
- 任意の 1 文字にマッチします。
- [...]
-
括られた文字のうち任意の 1 文字にマッチします。
2 つの文字の間にハイフンを入れたものは、
範囲表現 (range expresion)
を表します。ソート順で 2 つの文字の間にある任意の文字と、
両端の 2 文字がマッチします。
ソートには現在のロケールの照合順序 (collating sequance)
と文字セットが用いられます。
[
の次の文字が
!
または
^
ならば、括られた文字に含まれない任意の文字がマッチします。
範囲表現における文字のソート順は、
現在のロケール (およびシェル変数
LC_COLLATE
が指定されていればその値)
によって決定されます。
-
は、文字集合の最初または最後の文字として含めると
マッチングの対象にできます。
]
は、文字集合の最初の文字として含めるとマッチングの対象にできます。
[ と ] の間では、文字クラス (character classes) を指定できます。 指定には [: class :] という記法を使います。ここで class は POSIX.2 標準で定義されている以下のクラスのいずれかです:
alnum alpha ascii blank cntrl digit graph lower print punct space upper xdigit
文字クラスは、そのクラスの属する任意の文字にマッチします。
[ と ] の間では、同値クラス (equivalence class) を指定できます。 指定には [= c =] という記法を使います。 これは現在のロケールにおける定義において c と同じ 照合重さ (collation weight) を持つ全ての文字にマッチします。
[ と ] の間では、[. symbol .] という記述は照合シンボル symbol にマッチします。組み込みコマンドの shopt を使ってシェルのオプション extglob が有効にされていると、 拡張パターンマッチング演算子がいくつか認識されるようになります。 以下の説明では、pattern-list は | で区切られた 1 つ以上のパターンのリストであるものとします。 以下のサブパターンを 1 つあるいは複数使うことにより、 複合パターンを作れます。
- ?( pattern-list )
- 与えられたパターンが 0 回または 1 回現われるとマッチします。
- *( pattern-list )
- 与えられたパターンが 0 回以上現われるとマッチします。
- +( pattern-list )
- 与えられたパターンが 1 回以上現われるとマッチします。
- @( pattern-list )
- 与えられたパターンのうち 1 つだけにマッチします。
- !( pattern-list )
-
与えられたパターンいずれにも含まれないもの全てにマッチします。
クォートの削除
先に処理される展開の後、クォートされていない \ , ' ,3" のうち、先の展開の結果でないものは全て削除されます。
リダイレクト
シェルが解釈する特別な記法を用いると、コマンドの実行前に入出力を リダイレクト できます。またリダイレクトを使うと、 現在のシェル実行環境に対してファイルをオープンしたり クローズしたりできます。以下に示すリダイレクト演算子は、 単純なコマンド の前や途中に置くことができ、また コマンド の後に置けます。 リダイレクトは左から右へと、現われた順に処理されます。
以下の説明においては、ファイル・ディスクリプター番号が省略され、 かつリダイレクト演算子の最初の文字が < ならば、リダイレクトは標準入力 (ファイル・ディスクリプター 0) を参照します。 リダイレクト演算子の最初の文字が > ならば、リダイレクトは標準出力 (ファイル・ディスクリプター 1) を参照します。
以下の説明では、リダイレクト演算子の次の単語に対しては、 特に説明しない限り、 ブレース展開・チルダ展開・パラメータ展開・コマンド置換・ 算術式展開・クォート削除・パス名展開・単語分割が行われます。 ある単語が複数の単語に展開された場合はエラーになります。
リダイレクトの順番には意味がある点に注意してください。
例えば、次のコマンド
ls >
dirlist 2>&
1
は標準出力と標準エラー出力を両方ともファイル
dirlist
に書き込みますが、次のコマンド
ls 2>&
1 >
dirlist
では標準出力だけがファイル dirlist に書き込まれます。なぜなら後者の場合には、標準エラー出力は dirlist にリダイレクトされる前の標準出力の複製となるからです。
bash
は、
以下の表にあるようなファイル名がリダイレクトに使用されると、
それらを特別に扱います。
- /dev/fd/fd
- fd が有効な整数ならばファイル・ディスクリプター fd が複製されます。
- /dev/stdin
- ファイル・ディスクリプター 0 が複製されます。
- /dev/stdout
- ファイル・ディスクリプター 1 が複製されます。
- /dev/stderr
- ファイル・ディスクリプター 2 が複製されます。
- /dev/tcp/host /port
- host が有効なホスト名またはインターネットアドレスで port が整数のポート番号ならば、 bash は対応するソケットに対して TCP 接続のオープンを試みます。
- /dev/udp/host /port
-
host
が有効なホスト名またはインターネットアドレスで
port
が整数のポート番号ならば、
bash
は対応するソケットに対して UDP 接続のオープンを試みます。
訳注 UDP connection というのはナンセンス?!?
ファイルのオープンや作成に失敗すると、リダイレクトも失敗します。
入力のリダイレクト
入力をリダイレクトすると、 word を展開した結果の名前を持つファイルがオープンされ、ファイル・ディスクリプター n で読み込めるようになります。 n が指定されていなければ、読み込みは標準入力 (ファイル・ディスクリプター 0) で行われます。
入力のリダイレクトは、一般的には以下の形式です:
[n
]<
word
出力のリダイレクト
出力をリダイレクトすると、 word の展開した結果の名前を持つファイルがオープンされ、ファイル・ディスクリプター n で書き込めるようになります。 n が指定されていなければ、書きこみは標準出力 (ファイル・ディスクリプター 1) に行われます。 ファイルが存在しなかった場合は作成されます。 ファイルが存在した場合はサイズ 0 に切り詰められます。
出力のリダイレクトは、一般的には以下の形式です:
[n
]>
word
リダイレクト演算子が > であり、かつ noclobber オプションが組み込みコマンド set に対して設定されている場合、word の展開で得たファイルが存在し、 かつそれが通常ファイルならば、リダイレクトは失敗します。 リダイレクト演算子が >| の場合や、 リダイレクト演算子が > で組み込みコマンド set に対する noclobber オプションが設定されていない場合、 word という名前のファイルが存在していてもリダイレクトが試みられます。
リダイレクトによる追加出力
この形式を使って出力のリダイレクトを行うと、 word を展開した結果の名前を持つファイルがオープンされ、ファイル・ディスクリプター n に対する出力がこのファイルに追加されるようになります。 n を指定しなければ、標準出力 (ファイル・ディスクリプター 1) で追加されます。 ファイルが存在しなければ、新しく作られます。
追加出力は一般的には以下の形式です:
[n
]>>
word
標準出力と標準エラー出力のリダイレクト
この構造を使うと、 標準出力 (ファイル・ディスクリプター 1) と標準エラー出力 (ファイル・ディスクリプター 2) の両方を、 word を展開した結果の名前を持つファイルにリダイレクトできます。
標準出力と標準エラー出力に対する形式は 2 つあります:
&>
word
および
>&
word
両者のうち望ましいのは前者の方です。これは次のものと同じ意味です:
>
word
2>&
1
ヒアドキュメント(Here Documents)
この形式のリダイレクトを用いると、 シェルは現在のソースから入力を読み込みます。 この読み込みは word を単独で含む行 (末尾にブランク文字があってはいけません) が現われるまで続きます。 その行までに読み込んだ行は、 コマンドの標準入力として扱われます。
ヒアドキュメントの形式を以下に示します:
<<[-]word here-document delimiter
word に対するパラメータ展開・コマンド置換・算術式展開・ パス名展開は全く行われません。 word が一部でもクォートされている場合は、 delimiter は word のクォートをほどいた結果 (クォート文字を削除した結果) となり、 ヒアドキュメントに含まれる行では展開が行われなくなります。 word がクォートされていなければ、 ヒアドキュメント中の全ての行に対して パラメータ展開・コマンド置換・算術式展開が行われます。 後者の場合には \<newline> という文字列は無視されます (出力から取り除かれます)。 また \ , $ , ` といった文字は \ を用いてクォートしなければなりません。
リダイレクト演算子が <<- ならば、行頭にあるタブ文字は全て入力行および delimiter を含む行から取り除かれます。 これにより、シェルスクリプト中のヒアドキュメントを 自然な形でインデントさせることができます。
ファイル・ディスクリプターの複製
リダイレクト演算子
[n
]<&
word
を使うと入力ファイル・ディスクリプターを複製できます。 word が 1 桁以上の数値に展開された場合、 n で示されるファイル・ディスクリプターが生成され、 そのファイル・ディスクリプターのコピーとなります。 word に含まれる数値が入力のためにオープンされたファイル・ディスクリプターを 指していない場合、リダイレクト・エラーが起きます。 word を評価した結果が - となった場合、ファイル・ディスクリプター n はクローズされます。 n が指定されていない場合、標準入力 (ファイル・ディスクリプター 0) が使われます。
同様に、演算子
[n
]>&
word
を使って出力ファイル・ディスクリプターを複製できます。 n が指定されていない場合は、標準出力 (ファイル・ディスクリプター 1) が使われます。 word に含まれる数値が、出力のためにオープンされた ファイル・ディスクリプターを指していない場合、 リダイレクト・エラーが起きます。特別な場合ですが、 n が省略され、かつ word が 1 桁以上の数字には展開されなかった場合、 前に説明したように標準出力と標準エラー出力がリダイレクトされます。
読み書きのためのファイル・ディスクリプターのオープン
リダイレクト演算子が
[n
]<>
word
ならば、 word を展開した結果の名前を持つファイルがファイル・ディスクリプター n での読み書きのためにオープンされます。 n が指定されていなければ、 ファイル・ディスクリプター 0 で読み書きが行われます。 ファイルが存在しなければ、新しく生成されます。
エイリアス
エイリアス(alias) を使うと、 ある単語が単純なコマンドの先頭の単語として使われた場合に、 この文字列を別の単語に置換できます。 シェルはエイリアスのリストを管理しています。 このリストは組み込みコマンドの alias と unalias を使って設定および設定の取り消しできます (後述の シェルの組み込みコマンド を参照)。 各コマンドの最初の単語がクォートされていない場合、 エイリアスかどうかが確認され、 エイリアスならばその単語はそのエイリアスのテキストと置換されます。 エイリアス名と置換されるテキストには、 シェルの入力として有効なものは何でも含めることができます。 これには先に挙げた メタ文字 も含まれますが、 例外としてエイリアス名に = を含めることはできません。 置換されるテキストの最初の単語に対しても エイリアスかどうかの評価がされますが、 最初の単語が展開されるエイリアスと同じ場合には 展開は 1度しか行われません。つまり ls が ls -F のエイリアスとなっているような場合には、 bash は置換される文字列を再帰的に展開することはありません。 エイリアスの値の最後の文字が ブランク文字 の場合、エイリアスに続く次のコマンドの単語に対しても エイリアス展開が試みられます。
エイリアスは alias コマンドで作成とリスト表示を行い、 unalias コマンドで削除します。
置換されるテキストに引き数を入れる仕組みはありません。 引き数が必要ならば、シェル関数を使わなければなりません (後述の 関数 を参照)
シェルが対話的でない時には、 shopt コマンドによって expand_aliases オプションが設定されていない場合に限り、 エイリアスの展開は行われません (後述の シェルの組み込みコマンド における shopt の説明を参照)。
エイリアスの定義や利用に関係する規則には、紛らわしい点があります。 bash は、ある行に書かれているコマンドを実行する前に必ず、 少なくとも 1 回は行全体を読み込みます。 エイリアスが展開されるのはコマンドを読み込んだ時であり、 実行する時ではありません。 したがって、別のコマンドと同じ行でエイリアス定義を行った場合には、 次の入力行が読み込まれるまではエイリアスの効果は現われません。 同じ行にあるエイリアス定義の後のコマンドは、 新しいエイリアスの影響を受けません。 この動作は関数を実行する場合にも問題になります。 エイリアスが展開されるのは関数定義が読み込まれる時であり、 関数が実行される時ではありません。 なぜなら、関数定義自身も複合コマンドだからです。 その結果として、関数内で定義されたエイリアスは、 その関数が実行されるまでは利用できません。 安全のため、エイリアス定義は独立した行で行うべきです。 複合コマンド内で alias を使ってはいけません。
ほとんど全ての用途において、 シェル関数でエイリアスを代用できます。
関数
シェル関数は、後で使うために一連のコマンドを保存するものです。 シェル関数の定義は既に シェルの文法 で説明しています。 シェル関数名が単純なコマンド名として使われた場合、 関数名に対応するコマンド群が実行されます。 関数は現在のシェルのコンテキスト内で実行されます。 つまり、新しいプロセスを生成して関数を処理することはありません (これはシェルスクリプトと対照的な点です)。 関数の実行中には、関数に与えた引き数が位置パラメータとなります。 特殊パラメータ # は更新され、この変更が反映されます。 位置パラメータ 0 は変わりません。 関数の実行中は FUNCNAME 変数に関数の名前が設定されます。 シェル実行環境の状態は全て、関数とその呼び出し側で同じになりますが、 例外として DEBUG トラップ (後述の シェルの組み込みコマンド の項で、組み込みコマンド trap の説明を参照) は継承されません。
関数ローカルの変数は、組み込みコマンド local で宣言できます。 普通は、変数とその値は関数とその呼び出し側で共有されます。
組み込みコマンド return が関数中で実行された場合、関数は終了し、 関数呼び出しの次のコマンドから実行が再開されます。 関数の終了時には、位置パラメータの値と特殊パラメータ # の値は、関数の実行前の値に戻ります。
関数の名前と定義をリスト表示するには、組み込みコマンドの declare や typeset を、オプション -f を付けて実行します。 declare や typeset をオプション -F で実行すると、関数名だけがリスト表示されます。 関数をエクスポートして、 サブシェルでその関数が自動的に定義されている状態にできます。 これを行うには、組み込みコマンドの export に -f オプションを付けて実行します。
関数は再帰させることができます。 再帰呼び出しの回数には制限はありません。
算術式評価
シェルにおいては、特定の状況下で算術式を評価させることができます (組み込みコマンドの let と 算術式展開 を参照)。 評価は long 型の整数として行われ、 オーバーフローのチェックは行われません。 ただし、0 での除算はトラップされ、エラーとしてのフラグが立てられます。 演算子とその優先度、結合規則は C 言語と同じです。 以下のリストは、 同じ優先度を持つ演算子をグループとしてまとめて列挙したものです。 優先度の高いものから順に列挙しています。
- id ++ id --
- 変数を評価し、その後 increment (加算)/ decrement (減算) する。
- ++id --id
- 変数を increment (加算) / decrement (減算) してから評価する。
- - +
- 単項式の負と正
- ! ~
- 論理的否定とビット単位の否定
- **
- 指数 (累乗)
- * / %
- 乗算、除算、剰余
- + -
- 加算と減算
- << >>
- 左ビットシフトと右ビットシフト
- <= >= < >
- 比較
- == !=
- 等値と非等値
- &
- ビット単位の AND
- ^
- ビット単位の排他的 OR
- |
- ビット単位の OR
- &&
- 論理的 AND
- ||
- 論理的 OR
- expr ?expr :expr
- 条件付き実行
- = *= /= %= += -= <<= >>= &= ^= |=
- 代入
- expr1 , expr2
-
コンマ
シェル変数をオペランドにすることもできます。 パラメータ展開は式の評価より前に行われます。 式の中では、パラメータの値は long 型の整数に強制的に変換されます。 式の中では、シェル変数を (パラメータ展開規則を用いずに) 変数名で参照できます。 変数の値は変数が参照された際に算術式として評価されます。 式で用いるためにシェル変数の整数属性を有効にする必要はありません。
先頭が 0 である定数は 8 進数として解釈されます。 先頭が 0x または 0X ならば 16 進数として解釈されます。 それ以外の場合には、数値は [base# ]n の形式で表します。ここで base は 2 から 64 の間の 10 進数であり、算術的な意味での基数を表します。 n はその基数における数を表します。 ある桁において 9 より大きい数字を表すには文字を使います。 文字を使う場合には、アルファベット小文字、大文字、_, @ をこの順番で使います。 base が 36 以下の場合には、大文字と小文字は区別されず、 大文字と小文字のどちらを使っても 10 から 35 までの数字を表現できます。
演算子は優先度の順に評価されます。括弧内にある部分式は最初に評価され、 前述の優先規則よりも優先させることができます。
条件式
条件式は複合コマンド
`-' ではなく `+' を使うと属性を消します。
ただし例外として、+a
を使って配列変数を破棄することはできません。
関数内で使った場合、
local
コマンドを使った場合と同様に name
はローカルとなります。
返り値は基本的には 0 ですが、不正なオプションに出会った場合、
``-f foo=bar''を使って関数を定義しようとした場合、
読み込み専用の変数に代入しようとした場合、
複合代入構文を使わずに配列変数に値を代入しようとした場合 (前述の
配列
を参照)、name
のいずれかが正しいシェル変数名でない場合、
読み込み専用変数の読み込み専用属性を無効にしようとした場合、
存在しない関数を -f
オプションで表示しようとした場合は除きます。
不正なオプションが与えられた場合とインデックス
n
がディレクトリスタックの終端を越えている場合を除き、
返り値は 0 となります。
-n オプションを与えるとリストにコマンド番号が付きません。 -r オプションを与えるとコマンドの順序が逆になります。 -l オプションを与えると、コマンドは標準出力にリスト表示されます。 それ以外の場合には、これらのコマンドが書かれたファイルに対し、 ename で指定したエディタが起動されます。 ename が与えられていない場合は、変数 FCEDIT の値が使われ、 FCEDIT も設定されていない場合には EDITOR の値が使われます。 どちらの変数も設定されていなければ、 が使われます。 編集が終了すると、編集されたコマンドがエコー表示され、実行されます。
2 番目の形式では、pat の部分をそれぞれ rep で置き換えた後に command が再実行されます。 これを利用している便利なエイリアスに ``r=fc -s''があります。 これを用いると ``r cc''と入力すれば ``cc''で始まる最も新しいコマンドを実行でき、 ``r''の入力すれば直前のコマンドを再実行できます。
最初の形式を用いた場合、不正なオプションがあるか、 first または last が履歴行の範囲外を指定していなければ、返り値は 0 となります。 -e オプションが与えられた場合、 返り値は最後に実行されたコマンドの返り値となるか、 あるいはコマンドの一時ファイルでエラーが起きた場合には偽となります。 2 番目の形式を用いた場合、 終了ステータスは再実行されたコマンドの終了ステータスとなります。 ただし、 cmd が有効な履歴行を指定していない場合は別で、この場合には fc は偽を返します。
オプションの終わりに到達すると、 getopts は 0 より大きい返り値で終了します。 OPTIND にはオプションでない最初の引き数のインデックスが設定され、 name には ? が設定されます。
getopts は通常位置パラメータを展開しますが、他の引き数が args に指定されている場合には、 getopts は位置パラメータでなくこれらを展開します。
getopts は 2 通りの方法でエラーを報告できます。 optstring の最初の文字がコロンならば、 静かな (silent) エラー報告が行われます。 通常の操作では、不正なオプションがある場合や オプションの引き数が足りない場合に診断メッセージが出力されます。 変数 OPTERR に 0 が設定されている場合、エラーメッセージは全く出力されません。 これは、 optstring の最初の文字がコロンでなくても同じです。
不正なオプションがあった場合、 getopts は ? を name に設定します。 さらに、静かなモードでない場合にはエラーメッセージが出力され、 OPTARG の設定が取り消されます。 getopts が静かなモードであれば、見つかったオプション文字は OPTARG に設定され、診断メッセージは出力されません。
必要な引き数が見つからず、かつ getopts が静かなモードでない場合には、疑問符 (? ) が name に設定され、 OPTARG の設定が取り消され、診断メッセージが出力されます。 getopts が静かなモードならば、コロン (: ) が name に設定され、 OPTARG には見つかったオプション文字が設定されます。
(指定の有無に関係なく) オプションが見つかった場合、 getopts は真を返します。 オプションの最後に到達した場合や、エラーが起きた場合には、 getopts は偽を返します。
不正なオプションがある場合、
履歴ファイルの読み書きの間にエラーが起きた場合、
-d
オプションの引き数として不正な offset
の値が与えられた場合、
-p
オプションの引き数として与えられた履歴展開が失敗した場合を除き、
返り値は 0 になります。
jobspec が与えられている場合、 そのジョブに関する情報だけが出力されるます。 不正なオプションがある場合や、不正な jobspec が与えられた場合を除き、返却ステータスは 0 です。
-x
オプションが与えられた場合、
jobs
は
command
や
args
中で見つかった
jobspec
を全て対応するプロセスグループ ID に置き換え、
args
を渡して
command
を実行し、その終了ステータスを返します。
popd
コマンドが成功すれば、
dirs
も実行され、返却ステータスは 0 となります。
popd
が偽を返すのは、不正なオプションがあった場合・
ディレクトリスタックが空の場合・
ディレクトリスタックの存在しないエントリが指定された場合・
ディレクトリ変更に失敗した場合です。
format は必要に応じて再利用され、 全ての arguments を処理します。 与えられたよりも多くの arguments を format が必要とする場合、余分のフォーマット指定は、 0 と空文字列のうち、適切な方が指定されたかのように動作します。 成功した場合の返り値は 0 で、失敗した場合の返り値は 0 以外です。
pushd
コマンドが成功すると、
dirs
コマンドも実行されます。
最初の形式を使った場合、
dir
への cd が失敗しなければ、
pushd
は 0 を返します。
2 番目の形式を使った場合にも、
pushd
は基本的には 0 を返します。
ただし、ディレクトリスタックが空の場合・
ディレクトリスタックの存在しない要素が指定された場合・
指定された新しいカレントディレクトリへの
ディレクトリ変更が失敗した場合は除きます。
name
が全く与えられていない場合、読み込まれた行は変数
REPLY
に代入されます。ファイル末尾に到達したり
read
がタイムアウトしたりしなければ、終了コードは 0 です。
option-name
無しで
-o
オプションを与えた場合、現在のオプションが出力されます。
option-name
無しで
+o
オプションを与えた場合、現在のオプション設定を再生成する
set
コマンドの列が標準出力に出力されます。
特に断らない限り、各オプションはデフォルトで無効になっています。
- の代わりに + を使うと、これらのオプションは無効になります。
オプションはシェルを起動する際の引き数としても指定できます。
現在のオプションの集合は、
$-
で知ることができます。
不正なオプションが無ければ、終了ステータスは必ず真となります。
引き数 optname 無しで -s オプションまたは -u オプションを使った場合、表示されるものは設定されているもの、 または設定されていないものにそれぞれ制限されます。 特に断らない限り、shopt オプションは デフォルトで無効 (設定解除) になっています。
オプションをリスト表示した時の返却ステータスは、 全ての optnames が有効になっている場合は 0 となります。 それ以外の場合には 0 でない値となります。 設定または設定取り消しのオプションの時には、 optname が不正なシェルオプションでなければ、 返却ステータスは 0 となります。
shopt
オプションのリストを以下に示します:
式は次に示す演算子を使って結合できます。 優先度の高い順に示します。
test
および [
は、
引き数の数に基づいた規則の集合を用いて条件式を評価します。
limit
が与えられている場合、これは指定されたリソースの新しい値となります
(
-a
は表示専用です)。
オプションが全く与えられなかった場合は、
-f
が指定されたものと見なされます。
値は 1024 バイト単位で増えますが、例外として
-t
は秒単位、
-p
512 バイトブロック単位、
-n
および
-u
は単位無しの値です。
返却ステータスは基本的に 0 ですが、
不正なオプションがある場合、
unlimited
以外の数字でない引き数が limit
に指定された場合、
新しい制限を設定する際にエラーが起きた場合は除きます。
制限付きのシェル(RESTRICTED SHELL)
bash
を
rbash
という名前で起動した場合や、起動時に
-r
オプションを指定した場合には、シェルは制限された状態になります。
制限付きのシェルは、
標準のシェルよりも細かく制御された環境を設定したいときに用います。
制限付きのシェルは
bash
と全く同じように動作しますが、
以下のようなことが許可されなかったり実行されなかったりします:
cd
を使ってディレクトリを変更すること
SHELL
,
PATH
,
ENV
,
BASH_ENV
の値の設定や設定取り消しを行なうこと
/
を含むコマンド名を指定すること
組み込みコマンド
.
の引き数として
/
を含むファイル名を指定すること
組み込みコマンド
hash
に対するオプション
-p
の引数として
/
を含むファイル名を指定すること
起動時にシェル環境から関数定義をインポートすること
起動時にシェル環境から SHELLOPTS
の値を展開すること
リダイレクション演算子 >, >|, <>, >&, &>, >> を使ってリダイレクトを行
なうこと
組み込みコマンド
exec
を用いて、シェルを別のコマンドに置き換えること
組み込みコマンド
enable
に対する
-f
オプションと
-d
オプションを使って、組み込みコマンドを追加・削除すること
組み込みコマンド
command
に
-p
オプションを指定すること
set +r
や set +o restricted
を用いて制限モードを解除すること
これらの制限は、何らかの起動ファイルを読み込んだ後に適用されます。
シェルスクリプトであると判明したファイルが実行された時 (前述の コマンドの実行 を参照) には、 rbash はスクリプト実行用に立ち上げたシェルでは制限を全て無効にします。
関連項目
- Bash Reference Manual , Brian Fox and Chet Ramey
- The Gnu Readline Library , Brian Fox and Chet Ramey
- The Gnu History Library , Brian Fox and Chet Ramey
- Portable Operating System Interface (POSIX) Part 2: Shell and Utilities , IEEE
- sh (1), ksh (1), csh (1)
- emacs (1), vi (1)
- readline (3)
ファイル
- bash の実行ファイル。
- システム全体用の初期化ファイル。ログインシェルが実行します。
- 個人用の初期化ファイル。ログインシェルが実行します。
- 対話シェルごとに実行される、個人用の起動ファイル。
- 個人用のログインシェル後処理ファイル。 ログインシェルの終了時に実行されます。
- 個人用の readline 初期化ファイル。
著者
Brian Fox, Free Software Foundation
bfox@gnu.org
Chet Ramey, Case Western Reserve University
chet@ins.CWRU.Edu
バグ報告
bash のバグを見つけたら必ず報告してください。 ただし報告の前には、それが本当にバグであることと、 バグが最新版の bash で起こることを確かめてください。
本当にバグがあると判断した場合には、 bashbug コマンドを使ってバグ報告を行います。 バグを修正してくださった場合には、 ぜひその内容も一緒にメールしてください! 提案や「哲学上の」バグ報告は、bug-bash@gnu.org にメールしたり、 ニュースグループの gnu.bash.bug に投稿してくださっても構いません。
バグ報告には必ず以下のことを書いてください:
- bash のバージョン
- ハードウェアとオペレーティングシステム
- コンパイルに使ったコンパイラ
- バグ動作の説明
- バグを再現できる簡単なシェルスクリプトまたは「レシピ」
-
bashbug コマンドは、バグ報告を送るために用意されているテンプレートに、 最初の 3 項目を自動的に書き込みます。
このオンラインマニュアルに関するコメントやバグ報告は chet@ins.CWRU.Edu 宛にお願いします。
バグ
bash は大きすぎるし、遅すぎます。
bash と昔ながらのバージョンの sh にはちょっとした違いがいくつかあります。この大部分は POSIX の仕様のせいで生じたものです。
使い方によっては、エイリアスは混乱の元になります。
シェル組み込みコマンドとシェル関数は停止・再実行できません。
複合コマンドや `a ; b ; c' の形式のコマンド列は、 プロセスのサスペンドを行う際に綺麗に扱うことができません。 プロセスを停止すると、 シェルはコマンド列の次のコマンドを即座に実行するからです。 この問題はコマンド列を括弧の中に置いて サブシェルに実行させることで解決できます。 こうすれば、ひとまとまりのものとして停止できます。
$( ...) を使ったコマンド置換の内部にあるコマンドは、 置換が実行される時まで展開されません。 これにより、コマンドを入力してしばらく経つまでエラー出力が遅れます。
配列変数は (まだ) エクスポートできません。