BASH(1)

名前
bash - GNU Bourne-Again SHell

書式
bash [options] [file]

著作権
Bash is Copyright (C) 1989-1999 by the Free Software Foundation, Inc.

説明
bash は、標準入力やファイルから読み込んだコマンドを実行する、sh 互換 のコマンド言語インタプリタです。 bash には、Korn シェルと C シェル(ksh と csh) の便 利な機能も採り入れられています。

bash は IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2) に準拠する実装を目指しています。

オプション
組み込みコマンド set の説明で述べられている、1 文字で表されるシェ ルオプションに加え、bash は以下のオプションを起動時に解釈します:

-c string
    -c オプションが指定されている場合、コマンドは string から読み込まれます。 string の後に引き数があれば、これらは $0 から始まる位置付きパラメータ(positional parameter) に代入されます。
-r  -r オプションが指定されていると、シェルは 制限された状態(restricted) となります(後述の 制限付きのシェル を参照してください)。
-i  -i があると、シェルは 対話的(interactive) に動作します。
-s  -s オプションがあるか、あるいはオプション処理の後に引き数が残っていなけれ ば、コマンドは標準入力から読み込まれます。このオプションを使うと、対話 的シェルを呼び出すときに位置付きパラメータを設定することができます。
-D  $ の後に二重引用符でクォートした文字列が続くリストが全て標準出力 に出力されます。 これらは、現在のロケールが C または POSIX でない場合に言語の翻訳の対象 となる文字列です。このオプションは -n オプションを暗黙的に含み ます。つまり、コマンドは全く実行されません。
--  -- はオプションの終わりを示し、それ以降のオプション処理を止めます。 -- 以降の引き数は全て、ファイル名や引き数として扱われます。 引き数 - は -- と同じです。

bash が解釈するオプションには複数の文字からなるものもたくさんあります。この ようなオプションを認識させるためには、コマンドライン中において、1 文字 からなるオプションよりも前に置かなければなりません。

--dump-po-strings
    -D と同じですが、出力は GNU gettext の po(ポータブ ルオブジェクト)ファイル形式で行われます。
--dump-strings
    -D と同じです。
--help
    使用方法についてのメッセージを標準出力に表示し、正常終了します。
--login
    ログインシェル(後述の 起動 セクションを参照) として起動したかのように bash を動作させます。
--noediting
    対話的動作の場合、コマンドラインを読み込むときに GNU readline ライブラリを使用しません。
--noprofile
    システム全体用の起動ファイル も個人用の初期化ファイル ~/.bash_profile, ~/.bash_login, ~/.profile も読み込みません。デフォルトでは、 bash はログインシェルとして起動された時にこれらのファイルを読み込みます(後 述の 起動 セクションを参照)。
--norc
    シェルが対話的動作を行う場合に、個人用初期化ファイル ~/.bashrc の読み込み・実行を行いません。シェルが sh として呼び出された場合には、このオプションはデフォルトで有効になります。
--posix
    bash の動作のうち、デフォルトの操作が POSIX 1003.2 の標準と異な る部分を、標準に適合するように変更します。
--rcfile file
    シェルが対話的動作を行う場合、標準の個人用初期化ファイル ~/.bashrc ではなく、 file からコマンドを実行します(後述の 起動 セクションを参照)。
--restricted
    シェルの動作を制限します(後述の 制限付きのシェル セクションを参照)。
--verbose
    -v と同じです。
--version
    実行した bash のバージョン情報を表示し、正常終了します。

引き数
オプション処理の後に引き数が残っており、かつ -c オプションと -s オプションのいずれも指定されていない場合、最初の引き数は、シェルコマン ドが記述されているファイル名として扱われます。 このように bash が起動された場合、 $0 にそのファイルの名前が設定され、位置付きパラメータに残りの引き数が設定 されます。 bash は、このファイルからコマンドの読み込みと実行を行い、そして終了します。 bash の終了ステータスは、スクリプト中で実行された最後のコマンド の終了ステータスになります。コマンドが全く実行されなければ、終了ステー タスは 0 です。

起動
ログインシェル(login shell)とは、引き数 0 の最初の文字が - であるシェル、または --login オプション付きで起動されたシェルのことです。

対話的なシェルとは、標準入力と標準出力がどちらも端末に接続されて いる(これは isatty(3) で調べられます)シェル、または -i オプション付きで起動されたシェルのことです。 bash が対話的に動作している場合には、 PS1 が設定され、 $- には i が含まれます。これを利用すると、この状態であるかどうかをシェルスクリプ トや起動ファイルの内部から調べることができます。

以下のパラグラフでは、 bash がどのように起動ファイルを実行するかを説明します。ファイルのいずれかが 存在するにも関わらず読み込みができない場合には、 bash はエラーを報告します。ファイル名に含まれるチルダは、 後述の 展開 セクションにおける チルダ展開 の項目で述べるように展開されます。

bash が対話的なログインシェルとして起動されるか、--login オプション 付きの非対話シェルとして起動された時、 bash はまず /etc/profile ファイル(存在すれば)からコマンドを読み込み、 実行します。 このファイルを読んだ後、 bash は ~/.bash_profile, ~/.bash_login, ~/.profile をこの 順番で探します。 bash は、この中で最初に見つかり、かつ読み込みが可能であるファイルからコマン ドを読み込んで実行します。 --noprofile オプションを使ってシェルを起動し、この動作を行わないようにすることがで きます。ログインシェルが終了するときに、 bash は(もしあれば) ~/.bash_logout ファイルを読み込んで実行します。

ログインシェルでない対話シェルとして起動するとき、 bash は(もしあれば) ~/.bashrc からコマンドを読み込み、実行します。こ の動作は --norc オプションで止めることができます。 --rcfile file オプションを使うと、 コマンドの読み込みと実行を ~/.bashrc からでなく file から 行わせることができます。

例えばシェルスクリプトの実行などで bash が非対話的に起動されたとき、 bash は 環境変数 BASH_ENV を調べ、この変数が定義されていればその値を展開し、得られた値をコマンド の読み込みと実行を行うファイル名として利用します。 つまり、 bash は以下のコマンドが実行されたのと同じように動作します:

    if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

ただし、ファイル名を探すために PATH 環境変数の値が使われることはありません。

sh という名前で bash を起動した場合、 bash は昔ながらのバージョンの sh の起動をできるだけまねようとします。 対話的なログインシェルとして起動された時、あるいは --login オプション付きの非対話シェルとして起動された時、 bash はまず /etc/profile と ~/.profile の順でコマンドの読み込みと実行をしようとします。 --noprofile オプションを使ってこの動作を行わないようにできます。 sh という名前の対話シェルとして起動した場合、 bash は環境変数 ENV を調べ、この変数が定義されていればその値を展開し、展開で得た値をコマン ドの読み込みと実行を行うためのファイル名として使います。 sh という名前で起動されたシェルが他の起動ファイルからコマンドの読み込みと 起動を行うことはないので、 --rcfile オプションは全く意味がありません。 sh という名前の非対話シェルとして起動された場合、 bash は他の起動ファイルを何も読み込みません。 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 リストは

    command && command2

という形式であり、 command が終了ステータス 0 を返した場合に限り command2 が実行されます。

OR リストは

    command || command2

という形式であり、 command が 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 ]]
    条件式 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 が返されます。

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 ] ... ) list ;; ] ... esac
    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)にはそれぞれ特殊な意味があるので、 その文字自身を表すためにはクォートしなければなりません。クォートの方法 には、 エスケープ文字(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) とは 名前 付きで表現されたパラメータです。

パラメータに値が代入されていれば、そのパラメータは設定されていると言わ れます。空文字列も有効な値です。一度値を設定すると、組み込みコマンドの unset を使わなければ設定を取り消すことはできません(後述の シェルの組み込みコマンド を参照してください)。

変数 には、以下の形の構文で代入を行うことができます:

    name=[value]

値 が与えられなかった場合、変数には空文字列が代入されます。全ての value に対して、チルダ展開、パラメータと変数の展開、文字列展開、コマンド置換、 算術式展開、クォート除去が行われます(後述の 展開 を参照)。変数の 整数 属性が設定されている(後述の シェルの組み込みコマンド を参照)場合、$((...)) の展開を使っていなくても 値 に対しての算術展開が行われます(後述の 算術式展開 を参照)。 特殊パラメータ で後述する "$@" という例外を除いて、単語の分割は行われません。パ ス名展開も実行されません。

  位置付きパラメータ(Positional Parameters)

位置付きパラメータ(positional parameter) は、1 桁以上の数値で表されるパラメータです。ただし、0 は含みません。位 置付きパラメータは、シェルが起動されたときにシェルの引き数を使って代入 されますが、組み込みコマンドの set を使って代入し直すこともできます。代入文を使って位置付きパラメータへの 代入を行うことはできません。シェル関数が実行されると、位置付きパラメー タは一時的に再配置されます(後述の 関数 を参照)。

2 桁以上の数値を含む位置付きパラメータを展開するときには、ブレース({}) で囲まなければなりません(後述の 展開 を参照)。

  特殊パラメータ

シェルはいくつかのパラメータを特別扱いします。このようなパラメータは参 照されるだけであり、値を代入をすることは許されません。
*   位置付きパラメータに展開されます(1 から始まります)。ダブルクォートの内 部で展開が行われたときは、それぞれのパラメータを 特別な変数である IFS の最初の文字で区切って並べた 1 つの単語に展開されます。つまり、 "$*" は "$1c$2c..." と同じです。こ こで c は変数 IFS の値の最初の文字です。 IFS が設定されていなければ、パラメータは空白で区切られます。 IFS が空文字列の場合、パラメータの間には区切り文字は入らず、全てのパラメー タは繋げられます。
@   位置付きパラメータに展開されます(1 から始まります)。ダブルクォートの内 部で展開が行われたときは、それぞれのパラメータは別々の単語に展開されま す。つまり "$@" は "$1" "$2" ... と同じです。位置付 きパラメータが無い場合には、"$@" と $@ を展開しても空文字列になります(つまり取り除かれます)。
#   位置付きパラメータの個数を示す 10 進値に展開されます。
?   最も近くに実行されたフォアグラウンドのパイプラインのステータスに展開さ れます。
-   現在のオプションフラグに展開されます。これは起動の時に指定したり、組み 込みコマンド set で設定したり、( -i オプション等で)シェルそのものが設定したりします。
$   シェルのプロセス ID に展開されます。() を使ったサブシェルの内部では、$ はサブシェルではなく、現在のシェルのプロセス ID に展開されます。
!   最も近くに実行されたバックグラウンド(非同期)コマンドのプロセス ID に展 開されます。
0   シェルまたはシェルスクリプトの名前に展開されます。これはシェルの初期化 時に設定されます。コマンドを記述したファイルを指定して bash を起動した場合、 $0 にはそのファイルの名前が設定されます。 -c オプションを付けて bash を起動した場合、実行する文字列の後の最初の引き数があれば、 $0 には、その値が設定されます。このオプションを指定していない場合には、 bash を起動する時に使ったファイル名が引き数 0 として設定されます。
_   シェルの起動時には、引き数リストで渡された、実行するシェルまたはシェル スクリプトの絶対ファイル名が設定されます。その後は、前のコマンドに対す る最後の引き数(展開後のもの)に展開されます。また、実行された各コマンド の完全なファイル名が設定され、そのコマンドにエクスポートされる環境変数 に設定されます。メールをチェックするときには、このパラメータは現在チェッ クしているメールのファイル名を保持します。

  シェル変数

以下の変数はシェルが設定します:

PPID
    そのシェルの親のプロセス ID。この変数は読み込み専用です。
PWD cd コマンドで設定された現在の作業ディレクトリ。
OLDPWD
    cd コマンドで設定された、1 つ前の作業ディレクトリ。
REPLY
    引き数が与えられなかった時に組み混みコマンド read によって読み込まれた行が設定されます。
UID 現在のユーザのユーザ ID に展開されます。初期化はシェルの起動時に行われ ます。また、この変数は読み込み専用です。
EUID
    現在のユーザの実効ユーザ ID に展開されます。初期化はシェルの起動時に行 われます。また、この変数は読み込み専用です。
GROUPS
    現在のユーザがメンバーになっているグループのリストを示す配列変数です。 この変数は読み込み専用です。
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 しても元には戻りません。

DIRSTACK
    現在のディレクトリスタックの内容を持つ配列変数(後述の 配列 を参照)です。組み込みコマンド dirs を使うと、スタック中のディレクトリがスタック順に表示されます。 配列変数の要素に代入を行うことで、既にスタックに入っているディレクトリ を変更することができますが、ディレクトリの追加と削除を行うためには、組 み込みコマンドの pushd と popd を使わなければなりません。 この変数に代入を行ってもカレントディレクトリは変わりません。 DIRSTACK を unset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。

PIPESTATUS
    フォアグラウンドのパイプラインで最も近くに実行されたプロセスの終了値の リストを含む配列変数です(後述の 配列 を参照)。

OPTARG
    組み込みコマンド getopts で処理した最後のオプション引き数の値(後述の シェルの組み込みコマンド を参照)。

OPTIND
    組み込みコマンド getopts で次に処理されるオプション引き数のインデックス(後述の シェルの組み込みコマンド を参照)。

HOSTNAME
    現在のホスト名が自動的に設定されます。

HOSTTYPE
    bash を実行するマシンの種類をユニークに記述する文字列が自動的に設定されます。 デフォルト値はシステム依存です。

OSTYPE
    bash を実行するオペレーティングシステムを記述する文字列が自動的に設定されま す。デフォルト値はシステム依存です。

MACHTYPE
    bash を実行するシステムの種類を完全に指定する文字列が、GNU 標準の cpu-会社-システム の形式で設定されます。デフォルト値はシステム依 存です。

SHELLOPTS
    コロン区切りのリストで、有効になっているシェルのオプションを示します。 リスト中のそれぞれの単語は、組み込みコマンド set の -o オプション(後述の シェルの組み込みコマンド を参照)に対する有効な引き数になっています。 SHELLOPTS に入っているオプションは、set -o を実行した場合にも on であると報告されます。 bash の起動時に、この変数が環境変数に入っている場合、どの起動ファイルを読む よりも前にリスト中のシェルオプションが有効になります。この変数は 読み込み専用です。

以下の変数はシェルが使用します。場合によっては、 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 はコマンドの結果として得られるファイルの名前を検索するためには使われま せん。
MAIL
    このパラメータにファイル名が設定されており、かつ変数 MAILPATH が設定されていなければ、 bash は指定されたファイルへのメールの到着をユーザに通知します。
MAILCHECK
    bash がメールをチェックする頻度を(秒数で)指定します。デフォルト値は 60 秒で す。メールをチェックする時間になると、シェルはプライマリのプロンプトを 表示する前にチェックを行います。この変数が設定されていない場合、シェル はメールのチェックを行いません。
MAILPATH
    メールのチェックに使うファイル名をコロンで区切って並べたリストです。特 定のファイルにメールが到着したときに出力されるメッセージは、`?' を使っ てファイル名をメッセージから区切ることによって指定できます。メッセージ のテキスト中で使われたときは、$_ は現在のメールファイルの名前に 展開されます。 設定例:
    MAILPATH='/usr/spool/mail/bfox?"You have mail":~/shell-mail?"$_ has mail!"'
    この変数のデフォルト値は bash が持っていますが、 bash が使うユーザのメールファイルの位置はシステム依存です (/usr/spool/mail/$USER 等)。
PS1 このパラメータの値は展開されて(後述の プロンプト を参照)、プライマリのプロンプト文字列として使われます。 デフォルト値は ``\s-\v\$ '' です。
PS2 このパラメータの値は PS1 と同じように展開され、セカンダリのプロンプト文字列として使われます。デ フォルト値は ``> '' です。
PS3 このパラメータの値は select コマンド(前述の シェルの文法 を参照)のプロンプトとして使われます。
PS4 このパラメータは PS1 と同じように展開されます。この値は 実行トレース中に bash が表示する各コマンド前に出力されます。 複数になった間接レベルを示すときは、 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 を指定すると、分を含み、 MMmSS.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
    この変数はロケールのカテゴリを指定する LANG と LC_ 変数の 値を全て上書きします。

LC_COLLATE
    この変数は、パス名展開の結果をソートするときに使う参照順序を決め、範囲 展開、同値クラス、パス名展開とパターンマッチングにおける参照順序の挙動 を決めます。

LC_CTYPE
    この変数は、パス名展開とパターンマッチングにおける文字の解釈と文字クラ スの挙動を決めます。

LC_MESSAGES
    この変数は、$ の後に続くダブルクォートされた文字列の変換に使うロ ケールを決めます。

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 character であり、履歴展開の先頭を示す文字です。通常、これは `!' です。 2 番目の文字は 簡易置換(quick substitution) 文字であり、前に入力したコマンドの 文字列を別の文字列に置き換えて再実行を行うための省略表現として使います。 デフォルト値は `^' です。 3 番目の文字は省略可能です。単語の先頭でこの文字が見つかると行の残りの 部分がコメントとなるような文字を指定します。これは通常は `#' で す。履歴コメント文字があると、その行の残りの単語に対する履歴置換はスキッ プされます。この文字があるからといって、必ずしもシェルのパーザが行の残 りの部分をコメントとして扱うわけではありません。

HOSTFILE
    と同じフォーマットであり、シェルがホスト名を補完する必要があるときに読 み込むファイルの名前を示します。このファイルは対話的に変更することがで きます。次にホスト名の補完を試みるとき、 bash は新しいファイルの内容を既存のデータベースに追加します。

auto_resume
    この変数はシェルによるユーザ対話のやり方とジョブ制御の設定を行います。 この変数を設定した場合、1 語からなる単純なコマンドをリダイレクション無 しで実行すると、これは存在している停止中のジョブで再実行させるものの候 補として扱われます。曖昧な指定は許されません。入力された文字列で起動さ れたジョブが複数ある場合には、最も近くにアクセスしたものが選ばれます。 この文脈における 名前 とは、コマンドを起動する際に使ったコマンドラインのことです。 この値に exact が設定されている場合、与えられた文字列は停止しているジョブの名前に正確 にマッチしなければなりません。 substring が設定されている場合は、与えられた文字列は停止しているジョブの名前の部 分文字列にマッチする必要があります。 substring という値は、ジョブ識別子の %? に似た機能を持っています(後述の ジョブ制御 を参照)。これ以外の値が設定されている場合、与えられた文字列は停止して いるジョブの名前のプレフィックスでなければなりません。これはジョブ識別 子の % と似た機能を持っています。

  配列
bash は 1 次元の配列変数を扱うことができます。配列のサイズの上限はありませ んし、メンバの連続的なインデックス付けや代入をしなければならないという 条件もありません。配列のインデックス付けは 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) と呼ばれるものです。

以下に示すそれぞれの場合、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 から始まります。

${#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 の値が空文字列であれば、単語分割は全く行われません。

明示的に指定した空の引き数("" または '')は削除さ れずに残ります。クォートされていない、暗黙的に指定された空の引き数は、 値を持たない パラメータ を展開した結果として得られますが、これらは削除されます。値を持たないパ ラメータがダブルクォート内部で展開されると、これは空である引き数となり、 消されずに残ります。

展開が行われなければ単語分割も行われない点に注意してください。

  パス名展開

-f オプションが指定されていなければ、単語分割を行った後に bash はそれぞれの単語が *, ?, (, [ を含んでいるかどうか調べます。 これらの文字のいずれかが見つかると、その単語は パターン と見なされ、パターンにマッチするファイル名をアルファベット順にソートし たリストに置換されます。 マッチするファイル名が見つからず、かつシェルのオプション nullglob が無効ならば、その単語は変更されずにそのまま残ります。 nullglob オプションが設定されており、かつマッチする単語が見つからなければ、その 単語は削除されます。 シェルのオプション nocaseglob が有効ならば、マッチングにおいてアルファベットの大文字と小文字は区別さ れません。 パターンをパス名展開に使うとき、名前の先頭やスラッシュの直後の ``.'' は明示的にマッチさせなければなりません。ただし、シェルのオプション dotglob が設定されている場合は除きます。 パス名のマッチングを行うとき、スラッシュ文字は必ず明示的にマッチさせな ければなりません。これ以外の場合には、 ``.'' が特別扱いされることはありません。 シェルのオプション nocaseglob, nullglob, dotglob の詳しい説明については、後述の シェルの組み込みコマンド に書かれている shopt の説明を参照してください。

シェル変数 GLOBIGNORE を使って、 パターン にマッチするファイル名の集合を制限することができます。 GLOBIGNORE が設定されていれば、マッチするファイル名のうち GLOBIGNORE 中のパターンにもマッチしたものは、マッチしたもののリストから取り除かれ ます。 ファイル名 ``.'' と ``..'' は必ず無視されます。これは GLOBIGNORE が設定されていても同じです。しかし、 GLOBIGNORE を設定するとシェルオプションの dotglob が有効になるので、 ``.'' で始まる他のファイル名は全てマッチします。 ``.'' で始めるファイル名を無視する古い動作をさせるには、 ``.*'' を GLOBIGNORE のパターンのいずれかにしてください。 GLOBIGNORE が unset されると、 dotglob オプションは無効になります。

パターンマッチング

パターンに含まれる文字のうち、後述する特殊パターン文字以外の文字は、自 分自身にマッチします。NUL 文字がパターン中に現われてはいけません。特殊 パターン文字をその文字そのものにマッチさせるためには、クォートしなけれ ばなりません。

特殊パターン文字は以下の意味を持っています:

*   空文字列を含む、任意の文字列にマッチします。
?   任意の 1 文字にマッチします。
[...]
    括られた文字のうち任意の 1 文字にマッチします。2 つの文字の間にマイナ ス記号を入れたものは、 範囲 を表します。つまり、辞書的に 2 つの文字の間になる任意の文字と、両端の
     2 文字がマッチします。 [ の次の文字が ! または ^ ならば、括られた文字に含まれない任意の文字がマッチします。 - は、文字集合の最初または最後の文字として含めるとマッチングの対象にする ことができます。 ] は、文字集合の最初の文字として含めるとマッチングの対象にすることができ ます。

    [ と ] の間では、文字クラス(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)
        与えられたパターンいずれにも含まれないもの全てにマッチします。

  クォートの削除

先に処理される展開の後、クォートされていない \, ', " のうち、先の展開の結果でないものは全て削除されます。

リダイレクション
シェルが解釈する特別な記法を用いて、コマンドの実行前に入出力を リダイレクト することができます。また、リダイレクションを使うと、現在のシェル実行環 境に対してファイルをオープンまたはクローズすることができます。以下に示 すリダイレクション演算子は 単純なコマンド の前や中に置くことができますし、 command の後に置くことができます。リダイレクションは、左から右に見て現われた順 に処理されます。

以下の説明においては、ファイルデスクリプタの番号が省略され、かつリダイ レクション演算子の最初の文字が < ならば、リダイレクションは標準入力(ファイルデスクリプタ 0)を指していま す。リダイレクション演算子の最初の文字が > ならば、リダイレクションは標準出力(ファイルデスクリプタ 1)を指していま す。

以下の説明では、リダイレクション演算子の次の単語に対しては、特に説明し ない限り、ブレース展開、チルダ展開、パラメータ展開、コマンド置換、 算術式展開、クォート削除、パス名展開が行われます。ある単語が複数の単語 に展開された場合、 bash はエラーを出力します。

リダイレクションの順番には意味がある点に注意してください。例えば、次の コマンド

    ls > dirlist 2>&1

は標準出力と標準エラー出力を両方ともファイル dirlist に書き込みますが、次のコマンド

    ls 2>&1 > dirlist

では標準出力だけがファイル dirlist に書き込まれます。なぜなら後者の場合には、標準出力が dirlist にリダイレクトされる前に、標準エラー出力が標準出力として複製されるから です。

ファイルのオープンや作成に失敗すると、リダイレクションも失敗します。

  入力のリダイレクション

入力をリダイレクトすると、 word の展開で得た名前を持つファイルがオープンされ、ファイルデスクリプ タ n で読み込めるようになります。 n が指定されていなければ、読み込みは標準入力(ファイルデスクリプタ 0 )で 行われます。

入力のリダイレクトは、一般的には以下の形式です:

    [n]<word

  出力のリダイレクション

出力をリダイレクトすると、 word の展開で得た名前を持つファイルがオープンされ、ファイルデスクリプ タ n で書き込めるようになります。 n が指定されていなければ、読み込みは標準出力(ファイルデスクリプタ 1)で 行われます。

出力のリダイレクトは、一般的には以下の形式です:

    [n]>word

リダイレクション演算子が > であり、かつ noclobber オプションが組み込みコマンド set に対して設定されている場合、word の展開で得たファイル名が存在し、 かつそれが通常ファイルならば、リダイレクションは失敗します。 リダイレクション演算子が >| の場合、または リダイレクション演算子が > かつ組み込みコマンド set に対する noclobber オプションが有効にされていない場合、word という名前のファイルが 存在していてもリダイレクションが試みられます。

  リダイレクトによる出力の追加

この形式を使って出力のリダイレクションを行うと、 word を展開した結果の名前を持つファイルがオープンされ、ファイルデスクリプタ n に対する出力がこのファイルに追加されるようになります。 n を指定しなければ、標準出力(ファイルデスクリプタ 1)に追加されます。ファ イルが存在しなければ、新しく作られます。

追加出力の一般的な書式は次のようになっています:

    [n]>>word

  標準出力と標準エラー出力のリダイレクト

bash ではこの構造を使って、標準出力(ファイルデスクリプタ 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 は変わりませ ん。シェル実行環境の状態は全て、関数とその呼び出し側で同じになりますが、 例外として DEBUG トラップ(後述の シェルの組み込みコマンド の項で、組み込みコマンド trap の説明を参照してください)は継承されません。

関数ローカルの変数は、組み込みコマンド local で宣言することができます。普通は、変数とその値は関数とその呼び出し側で 共有されます。

組み込みコマンド return が関数中で実行された場合、関数は終了し、関数呼び出しの次のコマンドから 実行が再開されます。関数の終了時には、位置付きパラメータの値と特殊パラ メータ # の値は、関数の実行前の値に戻ります。

関数の名前と定義をリスト表示するには、組み込みコマンドの declare や typeset にオプション -f を付けて実行します。 declare や typeset にオプション -F を付けると、関数名だけがリスト表示されます。 関数をエクスポートして、サブシェルでその関数が自動的に定義されている状 態にすることができます。これを行うには、組み込みコマンドの export に -f オプションを付けて実行します。

関数は再帰させることができます。再帰呼び出しの回数には制限はありません。

算術式評価
シェルにおいては、特定の状況下で算術式を評価させることができます(組み 込みコマンドの let と算術式展開を参照してください)。評価は long 型の整数として行われ、オーバーフローのチェックは行われません。た だし、0 での除算はトラップされ、エラーとしてのフラグが立てられます。 以下のリストは、同じ優先度を持つ演算子をグループとしてまとめて列挙した ものです。優先度の高いものから順に列挙しています。

- + 単項式の負と正
! ~ 論理的否定とビット単位の否定
**  指数
* / %
    乗算、除算、剰余
+ - 加算と減算
<< >>
    左ビットシフトと右ビットシフトと
<= >= < >
    比較
== !=
    等値と非等値
&   ビット単位の AND
^   ビット単位の排他的 OR
|   ビット単位の OR
&&  論理的 AND
||  論理的 OR
expr?expr:expr
    条件付き実行
= *= /= %= += -= <<= >>= &= ^= |=
    代入

シェル変数はオペランドにすることができます。パラメータ展開は式の評価よ り前もに行われます。式の中では、パラメータの値は必ず long 型の整数とし て扱われます。式で用いるためにシェル変数の整数属性を有効にする必要はあ りません。

先頭が 0 である定数は 8 進数として解釈されます。先頭が 0x または 0X な らば 16 進数として解釈されます。それ以外の場合には、数値は [base#]n の形式で表します。ここで base は 2 から 64 の間の 10 進数であり、算術的な意味での基数を表します。n はその基数にお ける数を表します。 ある桁において 9 より大きい数字を表すには文字を使います。文字を使う場 合には、アルファベット小文字、大文字、_, @ をこの順番で使います。 base は 36 以下の場合には、小文字と大文字を組み合わせて使って 10 から 35 までの数字を表現することができます。

演算子は優先度の順に評価されます。括弧内にある部分式は最初に評価され、 前述の優先規則よりも優先させることができます。

条件式
条件式は複合コマンド [[ と組み込みコマンドの test および [ によって使うことができ、ファイルの属性を調べたり、文字列比較や 算術式比較を行ったりすることができます。式は以下に示す単項のプライマリ や二値のプライマリから構成されます。プライマリのいずれかに対する file 引き数が /dev/fd/n という形式ならば、ファイルデスクリ プタ n が調べられます。

-a file
    file が存在するならば真となります。
-b file
    file が存在し、かつブロック特殊ファイルならば真となります。
-c file
    file が存在し、かつキャラクタ特殊ファイルならば真となります。
-d file
    file が存在し、かつディレクトリならば真となります。
-e file
    file が存在すれば真となります。
-f file
    file が存在し、かつ通常ファイルならば真となります。
-g file
    file が存在し、かつ set-group-id されていれば真となります。
-h file
    file が存在し、かつシンボリックリンクならば真となります。
-k file
    file が存在し、かつ ``sticky'' ビットが設定されていれば真となり ます。
-p file
    file が存在し、かつ名前付きパイプ(FIFO)ならば真となります。
-r file
    file が存在し、かつ読み込み可能ならば真となります。
-s file
    file が存在し、かつそのサイズが 0 より大きければ真となります。
-t fd
    ファイルデスクリプタ fd がオープンされており、かつ端末を参照していれば真となります。
-u file
    file が存在し、かつ set-user-id ビットが設定されていれば真となり ます。
-w file
    file が存在し、かつ書き込み可能ならば真となります。
-x file
    file が存在し、かつ実行可能ならば真となります。
-O file
    file が存在し、かつ実効ユーザIDに所有されていれば真となります。
-G file
    file が存在し、かつ実効グループIDに所有されていれば真となります。
-L file
    file が存在し、かつシンボリックリンクならば真となります。
-S file
    file が存在し、かつソケットならば真となります。
-N file
    file が存在し、かつ前回読み込まれた後に修正されていれば真となり ます。
file1 -nt file2
    file1 が(変更日時に関して)file2 より新しければ真となります。
file1 -ot file2
    file1 が file2 より古ければ真となります。
file1 -ef file2
    file1 と file2 が同じデバイスと i-ノード番号を持っていれば 真となります。
-o optname
    シェルオプション optname が有効ならば真となります。後述する組み込みコマンド set に対するオプションの説明中にあるオプション一覧を参照してください。
-z string
    string の長さが 0 ならば真となります。
-n string
string
    string の長さが 0 でなければ真となります。
string1 == string2
    文字列が同じならば真となります。== の代わりに = も使えます。
string1 != string2
    2 つの文字列が異なるならば真となります。
string1 < string2
    現在のロケールにおいて、string1 が string2 よりも辞書順で 前にある場合に真となります。
string1 > string2
    現在のロケールにおいて、string1 が string2 よりも辞書順で 後にある場合に真となります。
arg1 OP arg2
    OP は -eq, -ne, -lt, -le, -gt, -ge のいずれかです。 これらの二値演算子が真を返すのはそれぞれ、arg1 が arg2 に 対して等しい場合、等しくない場合、小さい場合、小さいか等しい場合、大き い場合、大きいか等しい場合です。 arg1 や arg2 には、正または負の整数を用いることができます。

単純なコマンドの展開
単純なコマンドを実行すると、シェルは以下に示す展開、代入、リダイレクショ ンを左から右の順で実行します。

1.  パーザが変数代入(コマンド名の前にあるもの)またはリダイレクションと判断 した単語は、後で処理するために保存されます。

2.  変数代入でもリダイレクションでもない単語が展開されます。もし展開の後に 残っている単語があれば、その最初の単語がコマンド名となり、残りが引き数 となります。

3.  リダイレクションが前述の リダイレクション で説明したように実行されます。

4.  変数代入の = の後にあるテキストに対して、チルダ展開、パラメータ 展開、コマンド置換、算術式展開、クォート削除が行われます。この処理は変 数を代入する前に行われます。

コマンド名が残らなかった場合には、変数を代入した結果が現在のシェル環境 に効果を及ぼします。そうでない場合、変数は実行されるコマンドの環境に追 加されるだけで、現在のシェル環境には影響を与えません。読み込み専用の変 数に対して代入をしようとするとエラーが発生し、そのコマンドは 0 でない ステータスで終了します。

コマンド名が残らなかった場合、リダイレクションは行われますが、現在のシェ ル環境は影響を受けません。リダイレクションのエラーが起きると、コマンド は 0 でないステータスで終了します。

展開の後にコマンド名が残っている場合、後述するように実行が進行します。 そうでない場合はコマンドは終了します。展開のいずれかがコマンド置換であ る場合には、コマンドの終了ステータスは、最後に実行されたコマンド置換の 終了ステータスになります。コマンド置換が行われなかった場合には、コマン ドはステータス 0 で終了します。

コマンドの実行
コマンドが単語に分割された後に、単純なコマンドとそれに対する引き数リス ト(引き数リストは省略可能)となった場合、以下の動作が行われます。

コマンド名にスラッシュが含まれない場合、シェルはコマンドの位置を特定し ようとします。その名前のシェル関数が存在すれば、前に 関数 で説明したようにその関数が呼び出されます。 名前が関数にマッチしない場合には、シェルはシェルの組み込みコマンドのリ ストを探します。マッチするものがあった場合、その組み込みコマンドが呼び 出されます。

名前がシェル関数も組み込みコマンドでなく、かつスラッシュを含まない場合 には、 bash は PATH の各要素を検索し、その名前の実行ファイルを含むディレクトリを探します。 bash はハッシュ表を使って実行ファイルの完全な名前を記憶します(後述の シェルの組み込みコマンド の hash の項を参照してください)。 PATH に含まれるディレクトリの完全な探索は、そのコマンドがハッシュ表の中に無 い場合にのみ行われます。検索にも失敗すると、シェルはエラーメッセージを 出力し、終了ステータス 127 を返します。

検索に成功したか、コマンド名に 1 つ以上のスラッシュが含まれる場合には、 シェルは指定されたプログラムを独立した実行環境で実行します。引き数 0 には指定された名前が設定され、コマンドに対する残りの引き数には指定され た引き数が(もしあれば)設定されます。

このファイルが実行可能フォーマットでないために実行が失敗し、かつディレ クトリでもない場合には、このファイルは シェルスクリプト(shell script) であると見なされます。シェルスクリプトとは、シェルのコマンドが書かれて いるファイルのことです。シェルスクリプトを実行するためにサブシェルが呼 び出されます。このサブシェルは自分自身を再初期化し、シェルスクリプトを 処理するために新しいシェルが起動されたかのような結果になります。ただし、 親が記憶しているコマンドの位置(後述の シェルの組み込みコマンド) における hash の項を参照)は子にも引き継がれます。

プログラムが #! で始まるファイルである場合、最初の行の残りの部分はこのプログラムのイン タプリタを指定します。シェルは指定されたインタプリタをオペレーティング システム上で実行します。オペレーティングシステムは、この実行可能フォー マットを直接処理しません。インタプリタに対する引き数は、プログラムの先 頭の行のインタプリタ名の後の省略可能な引き数 1 つと、その後のプログラ ム名、さらに(もしあれば)その後のコマンドへの引き数から構成されます。

コマンド実行環境
シェルは以下の要素からなる実行環境(execution environment)を持っ ています:

•   起動時にそのシェルが継承したオープンされているファイル。これは組み込み コマンド exec に与えられているリダイレクション機能で変更されます。

•   現在の作業ディレクトリ(working directory)。これは cd, pushd, popd で設定するか、あるいは起動時にそのシェルが継承 します。

•   ファイル作成モードのマスク。これは umask で設定するか、あるいは そのシェルの親から継承します。

•   trap で設定された現在のトラップ。

•   シェルのパラメータ。これは変数の代入か set で設定されるか、ある いはその環境内にある親シェルから継承します。

•   実行中に定義されるか、その環境内にある親シェルから継承したシェル関数。

•   起動時に有効にしたか(デフォルト値あるいはコマンドライン引き数で設定し た値)、set で有効にしたオプション。

•   shopt で有効にしたオプション。

•   alias で定義したシェルエイリアス。

•   各種プロセスID。これにはバックグラウンドジョブや $$ の値、 $PPID の値が含まれます。

組み込みコマンドやシェル関数を除く単純なコマンドを実行するとき、このコ マンドは独立した実行環境内で呼び出されます。この環境は以下の要素から成 り立っています。特に断らない限り、この値はシェルから引き継がれます。

•   シェルのオープンしているファイルと、コマンドに対するリダイレクションで 指定した変更と追加をこれに加えたもの。

•   現在の作業ディレクトリ

•   ファイル作成モードのマスク

•   エクスポートするシェル変数と、そのコマンドに対してエクスポートされた変 数。これらは環境内で渡されます。

•   シェルが捕捉したトラップは、そのシェルの親から継承された値に再設定され ます。そのシェルが無視したトラップは無視されます。

この独立の環境内で呼び出されたコマンドは、シェルの実行環境に影響を及ぼ すことはできません。

コマンド置換と非同期コマンドは、サブシェル環境内で呼び出されます。 このサブシェル環境はシェル環境を複製したものです。ただし、 シェルが捕捉したトラップは、そのシェルの起動時に親から継承した値に再設 定されます。パイプラインの一部として起動された組み込みコマンドは、サブ シェル環境で実行されます。サブシェル環境に対して行われた変更は、元のシェ ル実行環境に影響を及ぼすことはできません。

環境変数
プログラムの起動時には、 環境変数(environment) と呼ばれる文字列の配列が渡されます。これは 変数名-値 の組 のリストであり、 変数名=値 という形になります。

シェルにおいては、様々な方法で環境変数を操作することができます。起動時 には、シェルは自分自身の環境変数を調べ、見つかった名前それぞれに対して パラメータを生成し、それに自動的に印を付けて子プロセスに エクスポート(export) します。実行されたコマンドは環境変数を継承します。 export コマンドまたは declare -x コマンドを用いると、パラメータや関数の追加と削除を環境変数に対して行う ことができます。環境変数内のパラメータの値が変更されると、新しい値は環 境変数の一部となり、古い値と置き換わります。実行されたコマンドが継承す る環境変数は、シェルの環境変数の初期値で作られます。この値はシェル内で 変更することができますし、変数と値の組は unset コマンドで削除することや export コマンドや declare -x コマンドで追加することができます。

単純なコマンド や関数に対する環境変数は、一時的に増やすことができます。 これは、既に パラメータ の項で説明した、パラメータ代入を前に置くことで行います。このような代入 が影響を与えるのは、そのコマンドから参照できる環境変数だけです。

-k オプションを設定(後述の組み込みコマンド set を参照)すると、コマンド名の前に置いたものだけではなく、 全ての パラメータ代入がそのコマンドに対する環境変数に影響を与えます。

bash が外部コマンドを起動したときには、変数 _ にはコマンドの完全なファイル名が設定され、環境変数としてそのコマンドに 渡されます。

終了ステータス
シェルの意図としては、終了コード 0 で終了したコマンドは正常終了したこ とになります。終了コード 0 は成功を示します。0 以外の終了コードは失敗 を示します。コマンドが致命的なシグナルで終了したときには、bash は「128+シグナル値」の値を使います。

コマンドが見つからなかった場合には、そのコマンドを実行するために生成さ れた子プロセスがステータス 127 を返します。コマンドが見つかったけれど 実行できなかった場合には、返却ステータスは 126 です。

展開やリダイレクションの際のエラーのためにコマンドが失敗した場合には、 0 より大きい終了ステータスが返されます。

シェルの組み込みコマンドは、成功した場合にはステータス 0 (真) を返し、実行中にエラーが起こった場合には 0 でない値(偽)を返しま す。

bash 自身が返す終了ステータスは、文法エラーが起きなければ、実行 した最後のコマンドの終了ステータスです。文法エラーの場合には、0 でない 値が終了ステータスとなります。後述の組み込みコマンド exit も参照 してください。

シグナル
bash が対話的であり、トラップが全く無いとき、bash は SIGTERM を無視し(したがって、kill 0 では対話シェルは kill されません)、 SIGINT (したがって、組み込みコマンド wait は割り込み可能です)を捕捉、処 理します。どんな場合でも、bash は SIGQUIT を無視します。 ジョブ制御が有効な状態ならば、 bash は SIGTTIN, SIGTTOU, SIGTSTP を無視します。

bash が起動した同期ジョブは、シェルが自分の親から継承した値をシ グナルハンドラに設定します。ジョブ制御が有効でないときには、非同期コマ ンドは SIGINT と SIGQUIT も無視します。 コマンド置換の結果として実行されたコマンドは、キーボードで生成されたジョ ブ制御シグナルを無視します。無視されるシグナルは SIGTTIN, SIGTTOU, SIGTSTP です。

デフォルトでは、シェルは SIGHUP を受け取ると終了します。終了する前には、シェルは実行中・停止中の全ての ジョブに対して SIGHUP を再送信します。停止しているジョブには SIGCONT が送られ、このジョブが SIGHUP を受け取ったことが確認されます。 特定のジョブに対してシェルからシグナルが送られないようにするためには、 組み込みコマンド disown (後述の シェルの組み込みコマンド を参照)を使って、そのジョブをジョブテーブルから削除するか、あるいは disown -h を使って、 SIGHUP を受け取らないようにマークを付けます。

シェルオプションの huponexit が shopt を使って設定されて場合、対話的なログインシェルが終了するときに、 bash は SIGHUP を全てのジョブに送ります。

コマンドの完了を待っている間に、トラップが設定されたシグナルを bash が受け取ったとき、そのトラップはコマンドが完了するまで実行 されません。bash が組み込みコマンドの wait を使って非同期 コマンドを待っている時に、トラップが設定されているシグナルを受け取ると、 組み込みコマンド wait は即座に復帰させられます。この際の終了ステー タスは 128 より大きい値になります。また、復帰するのはトラップが実行さ れた直後です。

ジョブ制御
ジョブ制御(job control) とは、プロセスの実行を選択的に停止(サスペンド, suspend)させ、後 でその実行を再び続けさせる(リジューム, resume)機能のことです。ユー ザは通常、システムの端末ドライバと bash を組み合わせて使うように用意されている対話的インタフェースを使ってこの 機能を利用します。

シェルは ジョブ(job) をパイプラインそれぞれに関連付けます。シェルは現在実行中のジョブのテー ブルを保存しています。このテーブルは jobs コマンドを使ってリスト表示させることができます。 bash がジョブを非同期的に( バックグラウンド で)起動したときには、 bash は以下のような行を出力します:

    [1] 25647

これは、このジョブのジョブ番号は 1 であり、このジョブに関連付けられて いるパイプライン中の最後のプロセスの ID が 25647 であることを示してい ます。 1 つのパイプラインに含まれる全てのプロセスは同じジョブのメンバーです。 bash は、 ジョブ という抽象化機構をジョブ制御の基本として使います。

ジョブ制御のユーザインタフェースの実装を利用しやすくするため、システムは 現在の端末プロセスのグループ ID(current terminal process group ID) という記録を管理しています。このプロセスグループのメンバー(プロセスグ ループ ID が現在の端末プロセスのグループ ID と等しいプロセス)は、 SIGINT のような、キーボードで生成されたシグナルを受け取ります。 このようなプロセスは、 フォアグラウンド(foreground) にあると言われます。 バックグラウンド(background) プロセスは、プロセスのグループ ID が端末のグループ ID と異なるプロセス です。このようなプロセスは、キーボードで生成したシグナルの影響を受けま せん。 端末への読み書きが許されるのはフォアグラウンドプロセスだけです。バック グラウンドプロセスが端末からの読み込み(端末への書き込み)を行おうとする と、このプロセスには端末ドライバから SIGTTIN (SIGTTOU) シグナルが送られます。このシグナルを捕捉していない場合には、プロセスは サスペンドします。

bash を動かしているオペレーティングシステムがジョブ制御をサポートしているな らば、ユーザは bash を使ってジョブ制御を行うことができます。 プロセスの動作中に サスペンド 文字(通常は ^Z, つまり Control-Z)を打ち込むと、そのプロセスは停止し、ユーザは bash に戻ります。 遅延サスペンド(delayed suspend) 文字(通常は ^Y, つまり Control-Y)を打ち込むと、そのプロセスが端末から入力を読み込もう としたときに停止し、制御が bash に戻ります。 その状態で、ユーザはこのジョブの状態を操作することができます。この時に 使うのは、バックグラウンドで実行を継続するならば bg コマンド、フォアグラウンドで実行を継続するならば fg コマンド、プロセスを kill するなら kill コマンドです。^Z の効果は即座に現われるので、未出力の出力や先行 入力した文字が破棄されるという副作用があります。

シェル上でジョブを参照する方法は色々あります。文字 % はジョブの名前を導入するのに使用します。ジョブ番号 n は %n として参照することができます。 ジョブを参照するためには、ジョブを起動する時に使った名前の先頭部分やコ マンドライン中に現われる部分文字列を使うこともできます。 例えば、 %ce は停止しているジョブ ce を指します。先頭の部分がマッチするジョブが複数個ある場合には、 bash はエラーを報告します。一方、 %?ce を用いると、文字列 ce をコマンドライン中に含む任意のジョブを参照できます。部分文字列がマッチ するジョブが複数個ある場合には、 bash はエラーを報告します。シンボル %% および %+ は、シェルが覚えている カレントジョブ(current job) を指します。これは、フォアグラウンドで起動されている時に停止されたか、 バックグラウンドで起動された最後のジョブです。 前のジョブ(previous job) は %- を使って参照することができます。jobs コマンドに伴う出力においては、カ レントジョブには必ず + というフラグが付き、前のジョブには - というフラグが付きます。

単にジョブを示すことで、そのジョブをフォアグラウンドに持ってくることが できます。つまり、 %1 は ``fg %1'' と同義であり、ジョブ 1 をバックグラウンドからフォアウグラウンドに持っ てきます。同様に、 ``%1 &'' はジョブ 1 をバックグラウンドで実行再開させます。これは ``bg %1'' と同じ意味です。

ジョブの状態が変わると、シェルはそれを即座に知ることができます。 bash がジョブの状態変化を報告するのは通常、プロンプトを出力する直前です。こ れは、他の出力を妨害しないためです。組み込みコマンド set で -b オプションが指定されていると、 bash はこのような変化を即座に報告します。

ジョブを停止させたままで bash を終了させようとすると、シェルは警告メッセージを出力します。このような 時には、 jobs コマンドを使ってジョブの状態を調べることができます。間にコマンドを実行 することなく bash を再び終了させようとすると、シェルは警告を繰り返さないで、停止されてい るジョブを終了させます。

プロンプト
対話的に動作している場合、 bash はコマンドを読む込み準備ができた時にプライマリプロンプト PS1 を表示し、コマンドを終了させるためにまだ入力が必要な時にセカンダリプロ ンプト PS2 を表示します。 bash ではこれらのプロンプト文字列をカスタマイズできます。この際にはバックス ラッシュでエスケープされた各種特殊文字を挿入することができますが、これ は以下のようにデコードされます:
    \a  ASCII のベル文字 (07)
    \d  "曜日 月 日" という形式の日付(例: "Tue May 26")
    \e  ASCII のエスケープ文字 (033)
    \h  ホスト名のうち最初の `.' までの部分
    \H  ホスト名
    \n  改行
    \r  復帰
    \s  シェルの名前。つまり $0 のベース名(最後のスラッシュ以降の部分)
    \t  現在の時刻。24 時間の HH:MM:SS 形式です。
    \T  現在の時刻。12 時間の HH:MM:SS 形式です。
    \@  現在の時刻。12 時間の am/pm 形式です。
    \u  現在のユーザのユーザ名
    \v  bash のバージョン (例: 2.00)
    \V  bash のリリース。バージョンにパッチレベルを加えたものです (例 : 2.00.0)
    \w  現在の作業ディレクトリ
    \W  現在の作業ディレクトリのベース名
    \!  このコマンドの履歴番号
    \#  このコマンドのコマンド番号
    \$  実効 UID が 0 の場合に # となり、それ以外の場合に $ となります。
    \nnn
        8進数 nnn に対応する文字
    \\  バックスラッシュ
    \[  非表示文字のシーケンスを開始します。これを使って、プロンプト中に端末の 制御シーケンスを埋め込むことができます。
    \]  非表示文字のシーケンスを終了します。

コマンド番号と履歴番号は異なるのが普通です: コマンドの履歴番号は履歴リストの一部です。履歴リストは、履歴ファイルか ら取り出せるコマンドを持つことができます。一方、コマンド番号は、現在の シェルのセッション中に実行されたコマンドのシーケンスにおける位置です。 この文字列がデコードされた後、さらにパラメータ展開、コマンド置換、 算術式展開、文字列展開、クォート削除が適用されます。展開はシェルオプション promptvars (後述の シェルの組み込みコマンド の項にある shopt コマンドの説明を参照)の値に基づいて行われます。

READLINE ライブラリ
Readline は対話シェルを使うときに入力の読み込みを処理するライブラリで す。ただし、シェルの起動時に --noediting オプションが指定された場合には使われません。 デフォルトでは、行編集に使うコマンドは emacs のコマンドに似ています。 vi 形式の行編集インタフェースを使うこともできます。シェルを起動した後 に行編集機能を無効にするには、組み込みコマンド set (後述の シェルの組み込みコマンド を参照)に対して +o emacs オプションまたは +o vi オプションを設定してください。

  Readline セクションにおける記法

このセクションでは、emacs 形式の記法を使ってキーストロークを表します。 コントロールキーは C-key で表します(例: C-n は Control-N の意 味です)。同様に メタ キーは M-key で表すので、M-x は Meta-X を表すことになります。( メタ キーが無いキーボードでは、M-x は ESC x を表します。つまり、 エスケープキーを押した後に x キーを押します。これは ESC を メタプレフィックス(meta prefix) に する操作です。M-C-x の組み合わせは、ESC-Control-x ある いはエスケープキーを押した後に、コントロールキーを押したまま x を押すことを示します。)

Readline のコマンドには数値の 引き数 を与えることができます。通常、これは繰り返しの回数として作用します。た だし、場合によっては、引き数の符号が意味を持つこともあります。前方に作 用するコマンド(例: kill-line)に負の引き数を渡すと、コマンドは後 方に作用します。引き数に対する動作がこの説明と異なるコマンドについては 後で説明します。

コマンドがテキストをキル(kill)するものと説明されている時は、削除 されたテキストは、後で取り出せる(ヤンク(yank)できる)ように保存さ れます。キルされたテキストは、キルリング(kill ring)に保存されま す。連続してキルを行うと、テキストは 1 つのまとまりとして保存されるの で、全部を一度にヤンクすることができます。テキストをキルしないコマンド は、テキストがキルリング上で別々になるようにします。

  Readline の初期化

コマンドを初期化ファイル(inputrc ファイル)に追加することにより、 readline をカスタマイズすることができます。このファイルの名前は、変数 INPUTRC の値から決まります。この変数が設定されていない場合のデフォルト値は ~/.inputrc です。 readline ライブラリを使うプログラムが起動する際には、この初期化ファイ ルが読み込まれ、キー割り当てと変数が設定されます。readline の初期化ファ イル中で使用できる基本的構文は、以下のように少ししかありません。 空行は無視されます。 # で始まる行はコメントです。 $ で始まる行は条件文です。 それ以外の行はキー割り当てと変数の設定です。

デフォルトのキー割り当ては inputrc で変更することができます。このライブラリを使う他のプログラムでも、独自 のコマンドとキー割り当てを追加することができます。

例えば、

    M-Control-u: universal-argument
や
    C-Meta-u: universal-argument
を inputrc ファイルに書くと、M-C-u で readline の universal-argument コマンドが実行されるようになります。

認識されるシンボリックな文字名を以下に示します: RUBOUT, DEL, ESC, LFD, NEWLINE, RET, RETURN, SPC, SPACE, TAB. readline では、コマンド名だけでなくキーにも文字列を割り当てることがで きます。つまり、そのキーが押されると文字列が挿入されます (マクロ, macro)。

  Readline のキー割り当て

inputrc ファイルにおける制御キーの割り当て方は単純です。必要なものは、コマンド の名前あるいはマクロのテキストと、これらが割り当てられるキーシーケンス だけです。名前は 2 通りの方法で指定することができます。つまり、シンボ リックなキーの名前(たぶん、これに Meta- や Control- プレ フィックスが付いたもの)による指定と、キーシーケンスによる指定です。 「keyname:function-name」あるいは 「keyname:macro」の形式を使うときには、 keyname は英語で書き下したキーの名前となります。例を以下に示します:

    Control-u: universal-argument
    Meta-Rubout: backward-kill-word
    Control-o: "> output"

この例では、 C-u が universal-argument に、 M-DEL が backward-kill-word に割り当てられます。 また、 C-o はマクロの実行に割り当てられ、右辺値に展開されます(つまり、テキスト > output が編集行に挿入されます)。

後者の形式である「"keyseq":function-name」または 「"keyseq":macro」においては、 keyseq は先程の keyname とは異なります。異なるのは、ダブルクォートで括ってキーシーケンス全体を 書くことにより、シーケンスを表す文字列を指定できる点です。以下の例で示 すように、GNU Emacs 形式のキーエスケープの一部を使うことができます。

    "\C-u": universal-argument
    "\C-x\C-r": re-read-init-file
    "\e[11~": "Function Key 1"

この例でも、 C-u が universal-argument 機能に割り当てられています。 C-x C-r は re-read-init-file 機能に割り当てられ、 ESC [ 1 1 ~ は Function Key 1 という文字列の挿入に割り当てられています。 GNU Emacs 形式のエスケープシーケンスを以下に全て示します:
    \C- コントロールプレフィックス
    \M- メタプレフィックス
    \e  エスケープ文字
    \\  バックスラッシュ
    \"  " という文字
    \'  ' という文字

GNU Emacs 形式のエスケープシーケンスに加えて、別の形のバックスラッシュ のエスケープを使うことができます:
    \a  警告 (ベル)
    \b  バックスペース
    \d  削除(delete)
    \f  フォームフィード
    \n  改行
    \r  復帰
    \t  水平タブ
    \v  垂直タブ
    \nnn
        ASCII コードの 8 進値が nnn である文字(3 桁で 1 文字)
    \xnnn
        ASCII コードの 16 進値が nnn である文字(3 桁で 1 文字)

マクロのテキストを入力する際には、マクロ定義を示すためには シングルクォートとダブルクォートを使わなければなりません。クォートされ ていないテキストは関数名と見なされます。マクロ本体では、前述のバックス ラッシュによるエスケープは展開されます。バックスラッシュはマクロのテキ スト内の他の文字を全てエスケープします。これには " や ' も含まれます。

bash では、組み込みコマンドの bind を使って、readline の現在の キー割り当ての表示と変更を行うことができま す。また、組み込みコマンド set に対する -o オプションを使って、編集モードを対話的利用の途中に切替えることができま す(後述の シェルの組み込みコマンド を参照)。

  Readline の変数

Readline の動作をカスタマイズすることができる変数が他にもあります。変 数は inputrc ファイル中に

    set variable-name value

という形式の文で設定することができます。 特に断らない限り、readline の変数は On または Off のいずれかです。 変数とそのデフォルト値を以下に示します:

bell-style (audible)
    readline が端末のベルを鳴らそうとしたときの動作を制御します。 none が設定されている場合は、readline はベルを鳴らしません。 visible が設定されている場合には、可能であれば可視ベル (visible bell)が用いられます。audible が設定されている場合には、 readline は端末のベルを鳴らそうとします。
comment-begin (``#'')
    readline の insert-comment コマンドが実行されたときに挿入される文字列です。このコマンドは、emacs モードでは M-# に割り当てられ、vi コマンドモードでは # に割り当てられます。
completion-ignore-case (Off)
    On が設定されていると、readline がファイル名のマッチングと補完を 行う際に大文字と小文字が区別されません。
completion-query-items (100)
    possible-completions コマンドが生成した補完候補の数が、いくつを 越えると表示の可否をユーザに問い合わせるのかを決めます。この変数には 0 以上の任意の整数を設定することができます。補完の候補数がこの変数の値以 上の場合には、ユーザに対して候補を表示するかどうかの問い合わせがなされ ます。そうでない場合には、単に端末に補完の候補がリスト表示されるだけで す。
convert-meta (On)
    On を設定すると、readline は 8 番目のビットがセットされている文 字を ASCII のキーシーケンスに変換します。変換は、8 番目のビットを落と して、エスケープ文字を前に追加することによって行います(実際には、エス ケープ文字をメタプレフィックスとして用います)。
disable-completion (Off)
    On を設定すると、readline は単語の補完を行わなくなります。補完さ れる文字の編集行への挿入は、その文字を self-insert に割り当てた かのように行われます。
editing-mode (emacs)
    readline の起動時に emacs と vi のどちらに似たキー割り当 てを使うのかを制御します。 editing-mode には emacs と vi のいずれかを指定することができます。
enable-keypad (Off)
    On を設定すると、readline はアプリケーションキーパッドが呼び出さ れた時に、これを有効にしようとします。一部のシステムでは、矢印キーを使 うためにこれを有効にする必要があります。
expand-tilde (Off)
    on を設定すると、readline が単語の補完を試みるときにチルダ展開が 行われます。
horizontal-scroll-mode (Off)
    on が設定されている時、readline は表示の際に行を 1 つしか使わな いようになります。つまり、行がスクリーンの幅より長くなると、新しい行に 折り返すのではなく、1 つの入力行の中で縦にスクロールします。
input-meta (Off)
    On が設定されていると、readline は 8 ビットの入力が可能になりま す(つまり、読み込んだ文字の再上位ビットを落としません)。この動作は、端 末のサポートとは無関係に行われます。 meta-flag という名前は、この変数の別名です。
isearch-terminators (``C-[C-J'')
    以降に文字をコマンドとして実行すること無くインクリメンタルサーチを終え る文字を集めた文字列です。この変数に値が設定されていなければ、 ESC と C-J でインクリメンタルサーチが終わります。
keymap (emacs)
    現在の readline のキーマップを設定します。正しいキーマップ名を全て挙げ ると、emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-command, vi-insert となります。vi は vi-command と同等で、emacs は emacs-standard と同等です。デフォルト 値は emacs です。 editing-mode の値もデフォルトキーマップに影響を与えます。
mark-directories (On)
    On が設定されていると、補完されたディレクトリ名の末尾にスラッシュ が追加されます。
mark-modified-lines (Off)
    On が設定されていると、履歴行を表示する際に、以前に変更されたも のの先頭にアスタリスク(*)を付けて表示します。
output-meta (Off)
    On が設定されていると、readline は 8 番目のビットが立っている文 字を直接表示します。メタ文字を前置したエスケープシーケンスでの表示は行 いません。
print-completions-horizontally (Off)
    On が設定されていると、readline は補完でマッチするものをアルファ ベット順に横に並べて表示します。画面上では縦には並べません。
show-all-if-ambiguous (Off)
    これは補完機能のデフォルトの挙動を変えます。 On が設定されている場合、単語に対する補完候補が複数個あると、マッチするも のが即座にリスト表示されます。ベルは鳴らされません。
visible-stats (Off)
    On が設定されていると、stat(2) で得られるファイルの種類を 表す文字が、補完候補のリスト表示の際に追加されます。

  Readline の条件構文

Readline には、C 言語のプリプロセッサの条件付きコンパイル機能と似た考 えの機能が実装されています。これを使うとキー割り当てや変数の設定を評価 の結果として実行することができます。パーザディレクティブは 4 つありま す。

$if $if 構文を使うと、編集モードや使っている端末、readline を使っているアプリ ケーションに基づいた割り当てを行うことができます。テストのテキストは行 の最後まで拡張されます。これを分離するには文字は必要ありません。

    mode
        $if ディレクティブの mode= 形式は、readline が emacs モー ドか vi モードのどちらになっているかを調べるために使います。例えばこれ を set keymap コマンドと一緒に使い、readline が emacs モードで始 まった時だけキーの割り当てを emacs-standard や emacs-ctlx キーマップに設定することができます。

    term
        term= フォームを使って、端末固有のキー割り当てを入れることができ ます。これは端末のファンクションキーが出力するキーシーケンスを割り当て る場合などに使うことができます。 = の右辺の単語は、端末の完全な名前および最初の - の前まで部分的な 名前の両方に対して評価されます。これにより例えば、 sun は sun と sun-cmd の両方にマッチすることができます。

    application
        application はアプリケーション固有の設定を入れるために使います。 readline ライブラリを使っているプログラムはそれぞれ アプリケーション名(application name)を設定し、初期化ファイルは特 定の値を調べることができます。 これを使って、キーシーケンスを特定のプログラム用の便利な機能に割り当て ることができます。例えば以下のコマンドは、bash 内で現在または 1 つ前の 単語をクォートするキーシーケンスを追加します:

        $if Bash
        # Quote the current or previous word
        "\C-xq": "\eb\"\ef\""
        $endif

$endif
    このコマンドは上の例で見たように、$if コマンドを終了させます。

$else
    $if ディレクティブのこの分岐内におけるコマンドは、テストが失敗し た時に実行されます。

$include
    このディレクティブはファイル名 1 つを引き数に取り、そのファイルからコ マンドとキー割り当てを読み込みます。例えば、以下のディレクティブを使う と /etc/inputrc が読み込まれます:

    $include  /etc/inputrc

  検索

readline には、指定した文字列を含む行をコマンド履歴内から探すコマンド が用意されています(後述の 履歴 を参照)。検索のモードには、 インクリメンタル(incremental) モードと 非インクリメンタル(non-incremental) モードの 2 つがあります。

インクリメンタルサーチは、ユーザが検索文字列の入力を終えるより前に検索 を開始します。検索文字列に文字が追加されるたびに、readline は現在まで 入力した文字列にマッチする履歴から次のエントリを表示します。インクリメ ンタルサーチで必要なのは、探している履歴エントリを見つけるために必要な 数の文字だけです。 インクリメンタルサーチを終了させるには、isearch-terminators の値 に現われる文字を使います。 この変数に値が代入されていない場合には、エスケープ文字または Control-J でインクリメンタルサーチが終了します。 Control-G はインクリメンタルサーチを異常終了させ、元の行を復元します。 検索が終了すると、検索文字列を含む履歴エントリが現在の行になります。 マッチした他の履歴リストのエントリを見つけるには、Control-S または Control-R を適宜入力します。これにより、今まで入力した検索文字列にマッ チする次のエントリを履歴の前方または後方に向かって探します。readline に割り当てられた他のキーシーケンスを入力すると検索が終わり、そのコマン ドが実行されます。例えば、改行は検索を終了させて、その行を入力し ます。これにより、履歴リスト中のコマンドが実行されます。

インクリメンタルでない検索の場合には、履歴行にマッチするものの検索を始 める前に検索する文字列全体を読み込みます。検索文字列には、ユーザが入力 したものか、現在の行の内容の一部を使うことができます。

  Readline のコマンド名

以下に示すのは、コマンドの名前およびそれらが割り当てられているデフォル トのキーシーケンスの一覧です。対応するキーシーケンスが無いコマンド名に は、デフォルトではキーは割り当てられていません。

  移動コマンド

beginning-of-line (C-a)
    現在の行の先頭に移動します。
end-of-line (C-e)
    行の末尾に移動します。
forward-char (C-f)
    1 文字進みます。
backward-char (C-b)
    1 文字戻ります。
forward-word (M-f)
    次の単語の最後に進みます。単語は英数字(文字と数字)からなります。
backward-word (M-b)
    現在、あるいは前の単語の先頭に戻ります。単語は英数字(文字と数字)からな ります。
clear-screen (C-l)
    現在の行を画面の一番上の行に残したまま、画面をクリアします。引き数を付 けると、画面をクリアせずに現在の行を再描画します。
redraw-current-line
    現在の行を再描画します。

  履歴操作のためのコマンド

accept-line (Newline, Return)
    カーソルの位置に関わらず、行を入力します。この行が空でなければ、変数 HISTCONTROL の状態に従って、これが履歴リストに追加されます。行が履歴リストを変更し たものならば、履歴行は元の状態に戻されます。
previous-history (C-p)
    履歴リストを戻り、履歴リストから前の行を取り出します。
next-history (C-n)
    履歴リストを進み、履歴リストから次の行を取り出します。
beginning-of-history (M-<)
    履歴の最初の行に移動します。
end-of-history (M->)
    入力履歴の最後に移動します。つまり、現在入力中の行に移動します。
reverse-search-history (C-r)
    現在の行を開始点にして後方に向かって検索を行い、必要に応じて履歴を「遡っ て」いきます。これはインクリメンタル検索です。
forward-search-history (C-s)
    現在の行を開始点にして前方に向かって検索を行い、必要に応じて履歴を「下っ て」いきます。これはインクリメンタル検索です。
non-incremental-reverse-search-history (M-p)
    現在の行を開始点にして、履歴リストを後方に向かって検索を行います。この 際には、ユーザが入力した文字列を探す、インクリメンタルでない検索を用い ます。
non-incremental-forward-search-history (M-n)
    現在の行を開始点にして、履歴リストを前方に向かって検索を行います。この 際には、ユーザが入力した文字列を探す、インクリメンタルでない検索を用い ます。
history-search-forward
    履歴を前方に向かって検索し、現在の行の先頭および現在のカーソル位置 (ポイント)の間の文字列を探します。これはインクリメンタル検索では ありません。
history-search-backward
    履歴を後方に向かって検索し、現在の行の先頭およびポイントの間の文字列を 探します。これはインクリメンタル検索ではありません。
yank-nth-arg (M-C-y)
    前のコマンドに対する最初の引き数(通常は前の行の 2 番目の単語)をポイン ト(現在のカーソル位置)に挿入します。引き数 n が付いていると、前のコマンドの n 番目の単語(前のコマンドの単語は 0 から数えます)。引き数が負ならば、前のコマンドの最後から n 番目 の単語が挿入されます。
yank-last-arg (M-., M-_)
    前のコマンドの最後の引き数(一つ前の履歴エントリの最後の単語)を挿入しま す。引き数があると、yank-nth-arg と全く同じように動作します。 yank-last-arg を繰り返して呼び出すと、履歴リストを遡って参照が 行われ、それぞれの行の最後の引き数が順番に挿入されます。
shell-expand-line (M-C-e)
    シェルが行うように行を展開します。これは、シェルが行う他の単語展開に加 えてエイリアスや履歴の展開も行います。履歴の展開の説明については、後述の 履歴の展開 を参照してください。
history-expand-line (M-^)
    現在の行で履歴の展開を行います。履歴の展開の説明については、後述の 履歴の展開 を参照してください。
magic-space
    現在の行で履歴の展開を行い、空白を挿入します。履歴の展開の説明について は、後述の 履歴の展開 を参照してください。
alias-expand-line
    現在の行でエイリアスの展開を行います。エイリアスの展開の説明については、 前述の エイリアス を参照してください。
history-and-alias-expand-line
    現在の行で履歴とエイリアスの展開を行います。
insert-last-argument (M-., M-_)
    yank-last-arg と同じものです。
operate-and-get-next (C-o)
    現在の行を実行のために入力し、現在の行の次の行を編集するために履歴から 取得します。引き数は全て無視されます。

  テキスト編集のためのコマンド

delete-char (C-d)
    カーソルがある位置の文字を削除します。ポイントが行の先頭であり、その行 に文字が無く、さらに打ち込んだ最後の文字が delete-char に割り当 てられていなければ、 EOF が返されます。
backward-delete-char (Rubout)
    カーソルの前の文字を削除します。数値の引き数を与えると、削除したテキス トをキルリング(kill ring)に保存します。
forward-backward-delete-char
    カーソルが行末になければカーソルの下の文字を消します。カーソルが行末に ある場合には、カーソルの後ろの文字が消されます。デフォルトでは、これは キーに割り当てられていません。
quoted-insert (C-q, C-v)
    次に打ち込んだ文字をそのまま行に追加します。これは C-q 等の文字 を挿入するために使います。
tab-insert (C-v TAB)
    タブ文字を挿入します。
self-insert (a, b, A, 1, !, ...)
    打ち込んだ文字を挿入します。
transpose-chars (C-t)
    ポイントの前にある文字を動かし、現在ポイントがある文字より手前に持って きます。ポイントも前に進みます。ポイントが行の最後にある場合は、ポイン トの前の 2 文字が交換されます。負の引き数は使えません。
transpose-words (M-t)
    カーソルの後ろにある単語を動かし、カーソルの前にある単語より前に持って いきます。この際には、始めに前にあった単語の後ろまでカーソルも移動しま す。
upcase-word (M-u)
    現在の(または後ろの)単語を大文字にします。負の引き数を指定すると、前の 単語を大文字にしますが、ポイントは動きません。
downcase-word (M-l)
    現在の(または後ろの)単語を小文字にします。負の引き数を指定すると、前の 単語を小文字にしますが、ポイントは動きません。
capitalize-word (M-c)
    現在の(または後ろの)単語をキャピタライズします。負の引き数を指定すると、 前の単語をキャピタライズしますが、ポイントは動きません。

  キルとヤンク

kill-line (C-k)
    現在のカーソル位置から行末までのテキストをキルします。
backward-kill-line (C-x Rubout)
    現在のカーソル位置から行頭までをキルします。
unix-line-discard (C-u)
    ポイントから行頭までをキルします。キルされたテキストはキルリング (kill-ring)に入ります。
kill-whole-line
    現在の行の文字を全てキルします。カーソルの位置は関係ありません。
kill-word (M-d)
    カーソルから現在の単語の終わりまでをキルします。カーソル位置が単語と単 語の間であれば、後ろの単語の終わりまでをキルします。単語の境界は forward-word で使われているものと同じです。
backward-kill-word (M-Rubout)
    カーソルの下にある単語をキルします。単語の境界は backward-word で使われているものと同じです。
unix-word-rubout (C-w)
    カーソルの下にある単語をキルします。その際には空白を単語の境界として用 います。つまり、単語の境界は backward-kill-word と異なります。
delete-horizontal-space (M-\)
    ポイントの周りの空白とタブを全て消します。
kill-region
    ポイントとマーク(mark, 保存してあるカーソル位置)の間のテキストを キルします。このテキストはリージョン(region)と呼ばれます。
copy-region-as-kill
    リージョン中のテキストをキルバッファにコピーします。
copy-backward-word
    ポイントの前の単語をキルバッファにコピーします。単語の境界は backward-word と同じです。
copy-forward-word
    ポイントの後ろの単語をキルバッファにコピーします。単語の境界は forward-word と同じです。
yank (C-y)
    キルリングの先頭のテキストをカーソル位置にヤンクします。
yank-pop (M-y)
    キルリングをローテートし、新たに先頭になったテキストをヤンクします。 yank または yank-pop の後にしか使えません。

  数値の引き数

digit-argument (M-0, M-1, ..., M--)
    既に蓄積されている引き数にこの数値を追加します。または、新しい引き数を 始めます。M-- を使って、負の値の引き数を始めることができます。
universal-argument
    この方法を使っても引き数を指定することができます。このコマンドの後に 1 つ以上の数字がある場合(頭にマイナス記号を付けることもできます)、これら の数字で引き数が定義されます。 コマンドの後に数字がある場合に、 universal-argument を再び実行すると数値の引き数を終えることができますが、そうでない場合は 無視されます。 特別な場合ですが、このコマンドの直後に数字でもマイナス記号でもない文字 がある場合には、次のコマンドの引き数カウントは 4 倍にされます。 最初は引き数カウントは 1 なので、この機能を一度実行すると引き数カウン トは 4 になり、次に実行すると引き数カウントは 16 になります。それ以降 も同様です。

  補完

complete (TAB)
    ポイントの前のテキストについて補完を試みます。 bash が補完を行う際にはテキストの扱いの種類を順に試しますが、その順序は、変 数(テキストが $ で始まる場合)、ユーザ名(テキストが ~ で始 まる場合)、ホスト名(テキストが @ で始まる場合)、コマンド(エイリ アスや関数も含みます)です。これらのうちいずれにもマッチしない場合には、 ファイル名補完を試みます。
possible-completions (M-?)
    ポイントの前のテキストを補完して得られるものの候補を列挙します。
insert-completions (M-*)
    ポイントの前のテキストを補完して得られるものを全て挿入します。挿入され るものは、possible-completions で列挙されるものと同じです。
menu-complete
    complete コマンドに似ていますが、補完される単語を、補完の候補リ ストのうちの 1 つと置換します。 menu-complete を繰り返して実行すると、補完の候補リストがそれぞ れ順番に挿入されます。 補完リストの最後まで来るとベルが鳴らされ、最終的には元のテキストに戻り ます。 引き数 n を指定すると、リスト中の位置が n 個進みます。負の 引き数を指定すると、リスト中を逆向きに戻ることができます。このコマンド は TAB に割り当てることを意図して用意されたものですが、デフォル トでは割り当ては行われていません。
delete-char-or-list
    カーソルが行頭や行末に無ければ、カーソルの下の文字を削除します (delete-char と同様です)。カーソルが行末にある場合は、 possible-completions と同じ動作をします。このコマンドはデフォル トではキーに割り当てられていません。
complete-filename (M-/)
    ポイントの前のテキストについて、ファイル名の補完を試みます。
possible-filename-completions (C-x /)
    ポイントの前のテキストについて、補完の候補を列挙します。テキストはファ イル名として扱います。
complete-username (M-~)
    ポイントの前のテキストについて補完を試みます。テキストはユーザ名として 扱います。
possible-username-completions (C-x ~)
    ポイントの前のテキストについて補完の候補を列挙します。テキストはユーザ 名として扱います。
complete-variable (M-$)
    ポイントの前のテキストについて補完を試みます。テキストはシェル変数とし て扱います。
possible-variable-completions (C-x $)
    ポイントの前のテキストについて補完の候補を列挙します。テキストはシェル 変数として扱います。
complete-hostname (M-@)
    ポイントの前のテキストについて補完を試みます。テキストはホスト名として 扱います。
possible-hostname-completions (C-x @)
    ポイントの前のテキストについて補完の候補を列挙します。テキストはホスト 名として扱います。
complete-command (M-!)
    ポイントの前のテキストについて補完を試みます。テキストはコマンド名とし て扱います。コマンド補完の際にマッチングを試みる順序は、エイリアス、予 約後、シェル関数、シェルの組み込みコマンド、実行ファイルです。
possible-command-completions (C-x !)
    ポイントの前のテキストについて補完の候補を列挙します。テキストはコマン ド名として扱います。
dynamic-complete-history (M-TAB)
    ポイントの前のテキストについて補完を試みます。テキストの比較が行われる のは、履歴リスト中の行のうち補完の候補となるものです。
complete-into-braces (M-{)
    ファイル名補完を実行し、補完の候補リストを返します。シェルが利用可能な リストとなるように、返される候補はブレースで括られます(前述の ブレース展開 を参照してください)。

  キーボードマクロ

start-kbd-macro (C-x ()
    入力された文字列の現在のキーボードマクロへの保存を開始します。
end-kbd-macro (C-x ))
    入力された文字列の現在のキーボードマクロへの保存を終え、この定義を格納 します。
call-last-kbd-macro (C-x e)
    最後に定義されたキーボードマクロを再実行します。再実行は、マクロ中の文 字列をキーボードでの入力と同様に出すことによって行います。

  その他

re-read-init-file (C-x C-r)
    inputrc ファイルの内容を読み込み、このファイル中の割り当てや変数 設定を取り込みます。
abort (C-g)
    現在の編集行を捨て、端末のベルを鳴らします(この動作は bell-style の設定に従って行います)。
do-uppercase-version (M-a, M-b, M-x, ...)
    メタ文字の入力に使う文字 x が小文字であれば、これに対応する大文 字に割り当てられているコマンドを実行します。
prefix-meta (ESC)
    次に入力した文字を、メタ文字の入力に使う文字にします。 ESC f は Meta-f と同じ意味です。
undo (C-_, C-x C-u)
    インクリメンタルアンドゥを行います。これは行ごとに別々に記憶されていま す。
revert-line (M-r)
    この行に対して行った変更を全て取り消します。このコマンドは、行が初期状 態に戻るまで undo コマンドを実行するようなものです。
tilde-expand (M-&)
    現在の単語についてチルダ展開を実行します。
set-mark (C-@, M-<space>)
    現在のポイントをマークに設定します。数字の引き数が与えられた場合には、 マークにはその位置が設定されます。
exchange-point-and-mark (C-x C-x)
    ポイントをマークと入れ換えます。現在のカーソル位置は保存されている位置 となり、古いカーソル位置がマークとして保存されます。
character-search (C-])
    文字を 1 つ読み込み、その文字が次に現われる場所にポイントを移動させま す。負のカウントを与えると、その文字が前に現われた場所を探します。
character-search-backward (M-C-])
    文字を 1 つ読み込み、その文字が前に現われた場所にポイントを移動させま す。負のカウントを与えると、その文字が次に現われる場所を探します。
insert-comment (M-#)
    まず readline の comment-begin 変数の値が現在の行の先頭に挿入され、次に改行が打ち込まれたのと同じよう に行の入力が行われます。これにより、コマンドラインがシェルのコメントと なります。
glob-expand-word (C-x *)
    ポイントの前の単語がパス名展開のパターンとして扱われ、この単語と置き換 えられる形でマッチするファイル名のリストが挿入されます。
glob-list-expansions (C-x g)
    glob-expand-word で生成されるのと同じ展開結果のリストが表示され、行が再描画されます。
dump-functions
    機能とそのキー割り当てを全て、readline の出力ストリームに出力します。 数値の引き数を与えると、出力は inputrc に書き込める形に整形され ます。
dump-variables
    設定可能な readline の変数とその値を全て readline の出力ストリームに出 力します。数値の引き数を与えると、出力は inputrc に書き込める形 に整形されます。
dump-macros
    マクロとマクロが出力する文字列に割り当てられた readline のキーシーケン スを全て出力します。数値の引き数を与えると、出力は inputrc に書 き込める形に整形されます。
display-shell-version (C-x C-v)
    現在実行している bash のバージョン情報を表示します。

履歴(HISTORY)
-o history オプションを組み込みコマンドの set で有効にすると、 コマンド履歴(command history)(以前に入力したコマンドのリスト) にアクセスできるようになります。最後に入力した HISTSIZE 個のコマンド(デフォルトは 500 個)のテキストが履歴リストに保存されます。 シェルが各コマンドを履歴リストに格納するのは、パラメータ展開や変数展開 (前述の 展開 を参照)を行う前ですが、履歴展開は実行された後です。履歴展開は HISTIGNORE と HISTCONTROL の値に従って実行されます。 起動時には、履歴の初期化は HISTFILE 変数(デフォルト値は ~/.bash_history)が示すファイルの内容に従って 行われます。 HISTFILE は HISTFILESIZE 行を越えないように、必要に応じて切り詰められます。 対話的なシェルが終了する際には、最後の HISTSIZE 個の行が履歴リストから HISTFILE にコピーされます。 シェルオプションの histappend ( シェルの組み込みコマンド の項の shopt の説明を参照)が有効ならば、これらの行は履歴ファイルに追加されます。こ のオプションが無効ならば、履歴ファイルは上書きされます。 HISTFILE が設定されていないか、履歴ファイルが書き込めない状態ならば、履歴は保存 されません。履歴の保存を行った後には、履歴ファイルは行数が HISTFILESIZE 行を越えないように切り詰められます。 HISTFILESIZE が設定されていなければ、切り詰めは行われません。

組み込みコマンド fc (後述の シェルの組み込みコマンド を参照)を用いて、履歴リストの一部のリスト表示や編集、再実行を行なうこ とができます。 組み込みコマンドの history を用いて、履歴リストの表示・編集や履歴ファイルの操作を行なうことができ ます。コマンドライン編集の際には、検索コマンドが各編集モードで利用でき ます。このコマンドを使って履歴リストにアクセスすることができます。

履歴リストに保存されたコマンドをシェルで制御することができます。 HISTCONTROL 変数と HISTIGNORE 変数を設定すると、シェルは入力されたコマンドの一部しか保存しなくなりま す。 シェルオプションの cmdhist を有効にすると、シェルは複数行に別れている行を同じ履歴エントリに保存し ようと試みます。この際には、文法的な正しさを保つために必要なセミコロン が追加されます。 シェルオプションの lithist を有効にすると、シェルはセミコロンではなく、行の途中に改行文字を置く形 でコマンドを保存します。シェルオプションの設定と設定取り消しの情報につ いては、後述の シェルの組み込みコマンド における説明を参照してください。

履歴の展開

bash は、 csh の履歴展開に似た履歴展開機能をサポートしています。このセクションでは、 履歴展開で使用できる記法を説明します。この機能は対話シェルならばデフォ ルトで有効になっていますが、組み込みコマンド set の +H オプションで無効にすることができます(後述の シェルの組み込みコマンド を参照)。非対話シェルの場合は、デフォルトでは履歴展開は行われません。

履歴展開は履歴リスト中の単語を入力ストリームに入れるものです。この機能 を利用すると、コマンドを繰り返すことや、前のコマンドに対して指定したオ プションを現在の入力行に挿入すること、前のコマンドの誤りを手早く直すこ とが簡単にできるようになります。

履歴展開が実行されるのは入力行全体を読み込んだ直後であり、シェルが行を 単語に分割するよりも前です。履歴展開の動作は 2 つに分けることができま す。最初の動作は、置換の時に使う行を履歴リストから選ぶことです。 次の動作は、その行の中から現在の行に書き込む部分を選ぶことです。 履歴リストから選ばれた行はイベント(event)と呼ばれ、 この行のうち動作の対象となる部分を単語列(words)と呼びます。様々 な修飾子(modifier)を使って、選択された単語列を操作することができ ます。 行は入力を読み込むのと同じ方法で単語に分割されるので、メタ文字で 区切られた複数の単語をクォートで括ったものは 1 つの単語と見なされます。 履歴展開が行われるのは、履歴展開文字が現われた時です。履歴展開文字はデ フォルトでは ! です。履歴展開文字をクォートできるのは、バッ クスラッシュ(\)とシングルクォートだけです。

組み込みコマンドの shopt で設定できるオプションをいくつか使って、履歴展開の動作を調整することが できます。 シェルオプションの histverify が有効であり(組み込みコマンド shopt の説明を参照)、かつ readline が使われている場合には、履歴置換を行った結果は即座にはシェルのパーザに 渡されません。 つまり展開された行は readline の編集バッファに再び読み込まれ、さらに編集が行える状態になります。 readline を使用しており、かつシェルオプションの histreedit が有効である場合、履歴置換が失敗してもその結果が readline の編集バッファに再読み込みされ、訂正できる状態となります。 組み込みコマンド history の -p オプションを使うと、履歴展開を行う前に、実際にはどのように展開されるの かを見ることができます。 組み込みコマンド history の -s オプションを使うと、実際にコマンドを実行しなくてもコマンドを履歴リスト の末尾に追加することができ、追加したコマンドは後で再呼び出しできるよう になります。

シェルでは、履歴展開の仕組みで使う各種文字列を制御することができます (前述の シェル変数 の項目における histchars の説明を参照してください)。

  イベント指示子(Event Designator)

イベント指示子は、履歴リスト中のコマンドラインエントリを参照するものです。

!   履歴置換を開始します。ただし、 ブランク文字、 改行文字、=、( が後に続く場合は除きます。
!n  コマンドライン n を参照します。
!-n 現在のコマンドラインから n 個前のものを参照します。
!!  前のコマンドを参照します。`!-1' と同義です。
!string
    string で始まるコマンドのうち、最も近くに実行したものを参照します。
!?string[?]
    string を含むコマンドのうち、最も近くに実行したものを参照します。 string の直後が改行文字ならば、最後の ? は省略しても構いません。
^string1^string2^
    簡易置換。 string1 を string2 に置換して直前のコマンドを繰り返します。 ``!!:s/string1/string2/'' と同義です(後述の修飾子を 参照)。
!#  今まで打ち込んだコマンド全体です。

  単語指示子(Word Designators)

単語指示子(word designator)が使われるのは、イベントから欲しい単語を選 ぶ時です。 : は単語指示子からイベント指定を分離します。 単語指示子が ^, $, *, -, % のいずれかで始まる場合には、これは省略することができます。単語には行の 先頭から番号が振られます。先頭の単語は 0 で表されます。単語は空白 1 つ で区切られて、現在の行に挿入されます。

0 (ゼロ)
    0 番目の単語です。シェルにとっては、これはコマンドを表す単語です。
n   n 番目の単語。
^   最初の引き数。つまり、単語 1 です。
$   最後の引き数。
%   最も近くの `?string?' の検索にマッチする単語。
x-y 単語の範囲。`-y' は `0-y' の省略形です。
*   0 番目を除く全ての単語です。これは `1-$' と同義です。イベント中 に 1 つしか単語が現われない場合に * を使ってもエラーにはなりません。このような場合には、空文字列が返されま す。
x*  x-$ の短縮形です。
x-  x* のように x-$ を省略したものですが、最後の単語は取り除 かれます。

イベント指定なしに単語指示子が与えられた場合、前のコマンドがイベントと して使われます。

  修飾子(Modifiers)

単語指示子(省略可能)の後には、以下に示す修飾子の 1 個以上の列が現われ ることがあります。それぞれの修飾子の前には `:' が付いています。

h   後ろにあるファイル名の構成要素を取り除き、先頭部分だけを残します。
t   前にあるファイル名の構成要素を取り除き、末尾部分だけを残します。
r   末尾にある .xxx という形のサフィックスを取り除き、ベース名だけを 残します。
e   後ろにあるサフィックス以外の部分を取り除きます。
p   新しいコマンドを表示しますが、実行はしません。
q   置換で得られた単語をクォートし、それ以上の置換が行われないようにします。
x   置換で得られた単語を q を使った場合と同じようにクォートしますが、 空白文字 と改行文字のところで単語に分割します。
s/old/new/
    イベント行で最初に現われた old を new に置き換えます。/ の代わりに任意の区切り文字を使うことができます。最後 の区切り文字がイベント行の最後の文字ならば、これは省略することができま す。 old と new の中では、バックスラッシュ 1 つでクォートすれば区切り文字を使うことが できます。 new に & が含まれている場合には、これは old に置き換えられます。 バックスラッシュ 1 つで & をクォートすることができます。 old が空文字列ならば、これには前回に置換された old が設定されます。または、以前に履歴置換が全く行われていない場合には、最 も近い !?string[?] の検索で使われた string が設定されます。
&   前回の置換を繰り返します。
g   変更をイベント行全体に適用します。これは `:s' と組み合わせて使わ れます(例: `:gs/old/new/')。`:s' と一緒に使っ た場合には、/ の代わりに任意の区切り文字を使うことができます。また最後 の区切り文字がイベント行の最後の文字であれば、これを省略することができ ます。

シェルの組み込みコマンド

特に断らない限り、このセクションで説明されている組み込みコマンドのうち - で始まるオプションを受け付けるものは、オプションの終わりを表す -- も受け付けます。

: [arguments]
    何もしません。このコマンドは arguments を展開し、指定されたリダイレクションを実行する以外には何も行いません。 終了コード 0 を返します。

.  filename [arguments]
source filename [arguments]
    filename からコマンドを読み込み、現在のシェル環境のもとで実行します。そして、 filename 中で最後に実行したコマンドの終了ステータスを返します。 filename にスラッシュが含まれていない場合、 filename を PATH に含まれるディレクトリから探します。 PATH 内で検索されるファイルは、実行可能である必要はありません。 PATH 中でファイルを見つけられなかった場合には、カレントディレクトリが検索さ れます。 組み込みコマンド shopt に対する sourcepath オプションが無効にされている場合、 PATH の検索は行われません。 何らかの arguments が与えられている場合、これらの引き数は、 filename を実行した時の位置付きパラメータとなります。そうでない 場合は、位置付きパラメータは変更されません。返却ステータスは、スクリプ ト内で最後に実行したコマンドのステータスです(コマンドが全く実行されな ければ 0 です)。 また、 filename が見つからない場合や読み込めない場合には偽となります。

alias [-p] [name[=value] ...]
    alias コマンドを引き数を付けずに (あるいは -p オプションを付けて)実行すると、エイリアスのリストが 「alias name=value」の形で標準出力に出力されます。引 き数を与えた場合には、value を与えられた name それぞれに対 するエイリアスが定義されます。 value の末尾に空白があると、エイリアスが展開された時に、空白の次 の単語についてエイリアス置換が調べられます。引き数リスト中にあり、 value が与えられていない name それぞれに対しては、名前とエ イリアスの値が出力されます。エイリアスが定義されていない name が 与えられなければ、alias は真を返します。

bg [jobspec]
    サスペンドされているジョブ jobspec をバックグラウンドで実行再開 します。このジョブは、初めから & を付けて起動されていたかのように動作を続けます。jobspec が無い場 合には、シェルが記録しているカレントジョブ(current job)が使われ ます。 bg jobspec は、ジョブ制御が無効にされていない時には 0 を返します。また、 jobspec が見つからないか、ジョブ制御なしで起動した場合には、ジョ ブ制御を有効にして実行されている時でも 0 を返します。

bind [-m keymap] [-lpsvPSV]
bind [-m keymap] [-q function] [-u function] [-r keyseq]
bind [-m keymap] -f filename
bind [-m keymap] keyseq:function-name
    readline の現在のキー割り当てと関数割り当ての表示します。あるいはキーシーケンスを readline の関数やマクロに割り当てます。受け付ける割り当ての記法は、 .inputrc と全く同じですが、それぞれの割り当ては別々の引き数として渡さなければな りません。例えば、'"\C-x\C-r": re-read-init-file' のように指定 します。オプションを指定した場合には、以下のような意味を持ちます:
    -m keymap
        keymap を、以降の割り当てに影響されるキーマップとして用います。指定できる keymap 名は、emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-command, vi-insert です。vi は vi-command と同じ です。また、emacs は emacs-standard と同じです。
    -l  readline 関数の名前を全てリスト表示します。
    -p  readline の関数の名前と割り当てを表示します。表示は、再び読み込 むことができる形式で出力されます。
    -P  readline の関数の現在の名前と割り当てをリスト表示します。
    -v  readline の変数名と値を表示します。表示は、再び読み込むことがで きる形式で出力されます。
    -V  readline の現在の変数名と値をリスト表示します。
    -s  readline のマクロに割り当てられたキーシーケンスと、マクロが出力 する文字列をを表示します。表示は、再び読み込むことができる形式で出力さ れます。
    -S  readline のマクロに割り当てられたキーシーケンスと、マクロが出力 する文字列をを表示します。
    -f filename
        キー割り当てを filename から読み込みます。
    -q function
        指定された function を呼び出すキーを問い合わせます。
    -u function
        指定された function に割り当てられているキーの割り当てを全て取り 消します。
    -r keyseq
        keyseq に対する現在の割り当てを削除します。

    認識できないオプションが与えられた場合やエラーが起きた場合でなければ、 返り値は 0 です。

break [n]
    for, while, until, select のループから抜けます。n が指定されていれば、n レベル分 break します。 n は 1 以上でなければなりません。 n がループの深さよりも大きい場合には、全てのループから抜けます。 break が実行された時にシェルがループを実行していなければ、返り値は 0 になり ます。

builtin shell-builtin [arguments]
    指定されたシェル組み込みコマンドを実行します。コマンドには arguments を引き数として渡し、このコマンドの終了ステータスを返します。これはシェ ル組み込みコマンドと同じ名前の関数を定義する時に便利で、その関数内で組 み込みコマンドを使った時に、その機能を損ないません。組み込みコマンド cd は普通、これを使って再定義されます。 shell-builtin がシェル組み込みコマンドでなければ、終了ステータスは偽となります。

cd [-LP] [dir]
    カレントディレクトリを dir に変更します。 変数 HOME の値が dir のデフォルト値です。変数 CDPATH は、 dir を含むディレクトリの検索パスを定義します。 CDPATH 内ではディレクトリ名はコロン(:)で区切ります。 CDPATH 中に空のディレクトリ名がある場合、これはカレントディレクトリ (つまり ``.'')を意味します。 dir がスラッシュ(/)で始まる場合には、 CDPATH は使われません。 -P オプションは、シンボリックリンクを辿らないで物理的なディレクトリ構造を 使うように指示します(組み込みコマンド set の -P オプションも参照してください)。 -L オプションを指定すると、シンボリックリンクを辿るようになります。引き数 に - を指定するのは、 $OLDPWD を指定するのと同じ意味です。 うまくディレクトリを変更できた場合には、返り値は真になります。そうでな い場合には偽になります。

command [-pVv] command [arg ...]
    command に引き数 args を付けて実行します。シェル関数の通常の参照は行いません。組み込みコマン ドと PATH 内で見つかるコマンドだけが実行されます。 -p オプションが与えられると、 command の検索を行う際には PATH のデフォルト値が使われます。これにより、標準ユーティリティを全て、確実 に見つけることができます。 -V オプションまたは -v オプションを与えると、 command の説明が出力されます。 -v オプションでは、 command を起動する時に使われるコマンドやファイル名を示す単語が表示されます。 -V ではさらに詳しい説明が表示されます。 -V オプションや -v オプションを与えた場合、終了ステータスは command が見つかれば 0 となり、見つからなければ 1 となります。どちらのオプショ ンも与えなかった場合に、エラーが起きたり command を見つけられなかったりすると、終了ステータスは 127 になります。それ以 外の場合には、組み込みコマンド command の終了ステータスは、 command の終了ステータスです。

continue [n]
    for, while, until, select ループの次の繰り返しから実行を継続します。 n を指定すると、深さが n 番目のループで実行を継続します。 n は 1 以上でなければなりません。 n がループの深さよりも大きい場合、最後のループ(「トップレベル」のループ) で実行が継続されます。 continue が実行された時にシェルがループの実行中でなかった場合を除き、返り値は 0 となります。

declare [-afFirx] [-p] [name[=value]]
typeset [-afFirx] [-p] [name[=value]]
    変数を宣言したり、変数に属性を与えたりします。name を指定しなけ れば、変数の値が表示されます。 -p オプションを指定すると、 name それぞれの属性と値が表示されます。 -p を使うと他のオプションは無視されます。 -F オプションを指定すると、関数定義の表示を止めることができます。この場合 には、関数の名前と属性だけが出力されます。 -F オプションを指定すると、 -f オプションも指定したことになります。以下のオプションを使うと、指定した 属性を持つ変数の出力を制限することや、変数に属性を与えることができます:
    -a  name はそれぞれ配列変数(前述の 配列 を参照)です。
    -f  関数名だけを使います。
    -i  変数を整数として扱います。変数に値が代入された時に算術式評価( 算術式評価 を参照)が実行されます。
    -r  name を読み込み専用にします。これ以降は、代入文を用いて値を代入 することや unset を行なうことはできません。
    -x  以降に実行するコマンドに環境経由でエクスポートするものとして、 name に印を付けます。

    `-' ではなく `+' を使うことにより属性を消すことができます。ただし例外 として、+a を使って配列変数を破棄することはできません。関数内で 使った場合、 local コマンドを使った場合と同様に name はローカルとなります。返り値は 基本的には 0 ですが、不正なオプションに出会った場合、"-f foo=bar" を 使って関数を定義しようとした場合、読み込み専用の変数に代入しようとした 場合、複合代入構文を使わずに配列変数に値を代入しようとした場合(前述の 配列 を参照)、name のいずれかが正しいシェル変数名でない場合、 読み込み専用変数の読み込み専用属性を無効にしようとした場合、存在しない 関数を -f オプションで表示しようとした場合は除きます。

dirs [-clpv] [+n] [-n]
    オプションが無いときは、現在記憶しているディレクトリのリストが表示され ます。デフォルトでは、全てのディレクトリ名は空白で区切って 1 行で表示 されます。ディレクトリは pushd コマンドによってリストに追加されます。 popd コマンドはリストからエントリを削除します。
    +n  オプション無しで dirs を起動した時に表示されるリストの左から数えて n 番目のエントリを 表示します。エントリは 0 から始まります。
    -n  オプション無しで dirs を起動した時に表示されるリストの右から数えて n 番目のエントリを 表示します。エントリは 0 から始まります。
    -c  全てのエントリを削除し、ディレクトリスタックをクリアします。
    -l  長い形式のリスト表示を行います。デフォルトのリスト表示フォーマットでは、 チルダを使ってホームディレクトリを表します。
    -p  1 行に 1 エントリの形でディレクトリスタックを出力します。
    -v  1 行に 1 エントリの形でディレクトリスタックを出力します。 各エントリの前にはスタック内でのインデックスが置かれます。

    不正なオプションが与えられた場合とインデックス n がディレクトリ スタックの終端を越えている場合を除き、返り値は 0 となります。

disown [-ar] [-h] [jobspec ...]
    オプション無しの場合には、それぞれの jobspec がアクティブなジョブのテーブルから削除されます。 -h オプションが与えられている場合、どの jobspec もテーブルから削除されず、 シェルが SIGHUP を受け取ってもそのジョブには SIGHUP が送られないように印が付けられます。 jobspec がなく、かつ -a オプションも -r オプションも与えられていない場合には、カレントジョブが使われます。 jobspec が与えられていない場合、 -a オプションは全てのジョブを削除するか全てのジョブに印を付けるという意味 となります。 jobspec 引き数なしで -r オプションを指定すると、実行中のジョブだけが操作の対象となります。 jobspec が不正なジョブを指定していなければ、返り値は 0 となります。

echo [-neE] [arg ...]
    arg を空白で区切って出力し、最後に改行を出力します。終了ステータ スは常に 0 です。 -n が指定された場合、最後の改行は出力されません。-e オプ ションを指定した場合、以下に示すバックスラッシュでエスケープする文字が 解釈されるようになります。 -E オプションを指定すると、デフォルトでこのようなエスケープ文字が解釈され るシステムであっても、エスケープ文字が解釈されないようになります。 echo は -- をオプションの終わりと解釈しません。 echo は以下のエスケープシーケンスを解釈します:
    \a  警告(ベル)
    \b  バックスペース
    \c  末尾に改行を付けない
    \e  エスケープ文字
    \f  フォームフィード
    \n  改行
    \r  キャリッジリターン
    \t  水平タブ
    \v  垂直タブ
    \\  バックスラッシュ
    \nnn
        ASCII コードの 8 進値が nnn である文字(1 文字につき数字 3 桁)。
    \xnnn
        ASCII コードの 16 進値が nnn である文字(1 文字につき数字 3 桁)。

enable [-adnps] [-f filename] [name ...]
    組み込みコマンドの有効/無効を設定します。 シェルは通常はディスクコマンドの前に組み込みコマンドを探しますが、組み 込みコマンドを無効にすると、シェルの組み込みコマンドと同じ名前を持つディ スクコマンドを、完全なパス名を指定しなくても実行することができます。 -n を用いると、それぞれの name は無効となります。それ以外 の場合には、name は有効となります。例えば、シェル組み込みのもので なく PATH 上にある test バイナリを使うには enable -n test を実行します。 -f オプションは新しい組み込みコマンド name を共有オブジェクト filename からロードするという意味です。これは動的ローディングをサポートしている システムで使えます。 -d オプションは、以前に -f オプションでロードした組み込みコマンドを削除します。 引き数 name が与えられなかった場合や、 -p オプションが与えられた場合、シェルの組み込みコマンドのリストが表示され ます。他にオプション引き数が指定されていない場合には、有効になっている シェル組み込みコマンドを全て含むリストが表示されます。 -n を与えると、無効にされている組み込みコマンドだけが出力されま す。 -a を与えると、それぞれ有効かどうかの表示付きで全ての組み込みコ マンドが出力されます。 -s を与えると、出力されるのは POSIX の特殊組み込みコマン ドだけに制限されます。 name がシェル組み込みコマンドで無い場合と、共有オブジェクトからの新しい組み 込みコマンドのロードに失敗した場合を除き、返り値は 0 となります。

eval [arg ...]
    arg が読み込まれ、結合されて 1 つのコマンドにされます。次に、こ のコマンドはシェルに読み込まれて実行され、その終了ステータスが eval の値として返されます。 args が無い場合や空の引き数しかない場合には eval は 0 を返します。

exec [-cl] [-a name] [command [arguments]]
    command が指定されていると、シェルはこのコマンドに置き換えられます。新しいプロ セスは生成されません。 arguments は command に対する引き数となります。 -l オプションを与えると、シェルは command に渡す 0 番目のオプションとしてダッシュを設定します。 これは login(1) が行う動作です。 -c オプションを与えると、 command は空の環境で実行されます。 -a を与えると、シェルは実行するコマンドに 0 番目の引き数として name を渡します。何らかの理由で command が実行できない場合には非対話シェルは終了します。ただしシェルオプション execfail が設定されている場合は含まれず、この場合には偽が返されます。 ファイルが実行できない場合には、対話シェルは偽を返します。 command が指定されていない場合、任意のリダイレクションはカレントシェルで効果を 表し、終了ステータスは 0 となります。リダイレクションのエラーが起きた 場合には、終了ステータスは 1 となります。

exit [n]
    ステータス n でシェルを終了させます。 n を省略すると、終了ステータスは最後に実行したコマンドの終了ステータスと なります。シェルが終了する前には、 EXIT に対するトラップが実行されます。

export [-fn] [name[=word]] ...
export -p
    与えられた name には印が付けられ、以降に実行するコマンドの環境に対して自動的にエクスポー トされるようになります。 -f オプションを与えると、 name は関数を示します。 name を与えなかった場合や、 -p オプションを与えた場合には、このシェル内でエクスポートされている全ての 名前のリストが出力されます。 -n オプションを与えると、指定した変数からエクスポート属性が取り除かれます。 不正なオプションがあった場合、name のいずれかが不正なシェル変数 名であった場合、関数でない名前に対して -f オプションを与えた場合を除き、 export は終了ステータス 0 を返します。

fc [-e ename] [-nlr] [first] [last]
fc -s [pat=rep] [cmd]
    フィックスコマンド(Fix Command)。最初の形式では、 first から last までの範囲のコマンドが履歴リストから選択されます。 first と last は文字列(その文字列で始まる最後のコマンド)や数値(履歴リスト中でのイン デックス。負の値は現在のコマンド番号からのオフセットとして扱われます) として指定することもできます。 last が指定されていなければ、リスト表示の場合には現在のコマンドが設定され (したがって fc -l -10 で最近のコマンド 10 個が出力されます)、それ以外の場合には first が設定されます。 first が指定されていなければ、編集の場合には前のコマンドが設定され、リスト表 示の場合には -16 が設定されます。

    -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 は偽を返します。

fg [jobspec]
    jobspec の実行をフォアグラウンドで再開し、これをカレントジョブとします。 jobspec が無い場合、シェルが記録しているカレントジョブが使われます。 返り値はフォアグラウンドで再開されたコマンドの返り値ですが、ジョブ制御 が無効であるときに実行した場合や、ジョブ制御が有効であっても jobspec が有効なジョブを指定していない場合や jobspec がジョブ制御無しで実行したジョブを指定している場合には偽となります。

getopts optstring name [args]
    getopts はシェルの手続きが位置付きパラメータを展開するために使います。 optstring は識別の対象であるオプション文字列です。ある文字の後にコロンがある場合、 そのオプションは引き数を取ることが期待されます。オプションは空白でオプ ション文字と区切られていなければなりません。 呼び出される度に、 getopts は次のオプションをシェル変数 name に格納し( name が存在しなければ初期化を行います)、次に処理される引き数のインデックス を変数 OPTIND に格納します。 OPTIND はシェルまたはシェルスクリプトが呼び出される度に 1 に初期化されます。 オプションが引き数を必要とする場合には、 getopts はその引き数を変数 OPTARG に格納します。 シェルが OPTIND を自動的に再設定することはありません。1 つのシェルが呼び出されている間 に別のパラメータの組合せを使う場合には、 getopts の呼び出しの間に手動で再設定を行わなければなりません。

    オプションの終わりに到達すると、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 は偽を返します。

hash [-r] [-p filename] [name]
    name それぞれに対して、 $PATH 内のディレクトリの検索を行ってコマンドの完全なファイル名を調べ、その結 果を記憶します。 -p オプションが指定されると、パス検索は実行されず、 filename がそのコマンドの完全なファイル名として使われます。 -r オプションを与えると、シェルは記憶している位置を全て忘れます。引き数が 与えられていない場合は、記憶しているコマンドに関する情報が出力されます。 name が見つからない場合と不正なオプションが与えられた場合を除き、返却ステー タスは真となります。

help [pattern]
    組み込みコマンドのヘルプ情報を表示します。 pattern が指定された場合には、 help は、この pattern にマッチする全てのコマンドに関する詳しいヘルプを出力します。それ以外の 場合には、全ての組み込みコマンドと制御構造についての説明が出力されます。 pattern にマッチするコマンドが全くない場合を除き、終了ステータスは 0 です。

history [-c] [n]
history -anrw [filename]
history -p arg [arg ...]
history -s arg [arg ...]
    オプションがない場合には、行番号付きでコマンド履歴を表示します。 * 付きでリスト表示されている行は変更されています。引き数 n を指定すると、最新の n 行だけがリスト表示されます。filename が与えられている場合、これ は履歴ファイルの名前として使われます。これが与えられていない場合には、 HISTFILE の値が使われます。(指定されていれば)オプションは以下の意味を持ちます:
    -a  「新しい」履歴行(bash の現在のセッションの開始以来入力された履歴 行)を履歴ファイルに追加します。
    -n  まだ履歴ファイルから読み込んでいない履歴行を現在の履歴リストに読み込み ます。これらは、bash の現在のセッションの開始以来、履歴ファイル に追加された行です。
    -r  履歴ファイルの内容を読み込み、これらを現在の履歴として用います。
    -w  現在の履歴を履歴ファイルに書き込みます。履歴ファイルの内容は上書きされ ます。
    -c  全てのエントリを削除して、履歴リストをクリアします。
    -p  後に続く args に対して履歴置換を行い、その結果を標準出力に表示し ます。この結果は履歴リストには格納されません。通常の履歴展開が行われな いようにするため、arg はそれぞれクォートしなければなりません。
    -s  args を 1 つのエントリとして履歴リストに格納します。履歴リストの最後のコマ ンドは、 args が追加される前に削除されます。

    不正なオプションがある場合や、履歴ファイルの読み書きの間にエラーが起き た場合を除き、返り値は 0 になります。

jobs [-lnprs] [ jobspec ... ]
jobs -x command [ args ... ]
    最初の形式を実行すると、アクティブなジョブがリスト表示されます。オプショ ンは以下の意味を持ちます:
    -l  通常の情報に加えて、プロセス ID をリスト表示します。
    -p  そのジョブが属するプロセスグループのリーダーのプロセス ID だけを表示し ます。
    -n  ユーザがステータスを最後に通知されて以来、ステータスの変更があったジョ ブに関する情報だけを表示します。
    -r  実行中のジョブだけ出力するように制限します。
    -s  停止中のジョブだけ出力するように制限します。

    jobspec が与えられている場合、そのジョブに関する情報だけが出力されるように制限 されます。不正なオプションがある場合や、不正な jobspec が与えられた場合を除き、返却ステータスは 0 です。

    -x オプションが与えられた場合、 jobs は command や args 中で見つかった jobspec を全て対応するプロセスグループ ID に置き換え、 args を渡して command を実行し、その終了ステータスを返します。

kill [-s sigspec | -n signum | -sigspec] [pid | jobspec] ...
kill -l [sigspec | exit_status]
    sigspec または signum で指定されたシグナルを、 pid または jobspec で指定されたプロセスに送ります。 sigspec は SIGKILL のようなシグナル名、またはシグナルの番号です。 signum はシグナルの番号です。 sigspec がシグナル名ならば、その名前には SIG プレフィックスはあっても無くても構いません。 sigspec が無い場合には、 SIGTERM が指定されたものとします。 引き数に -l を与えるとシグナル名がリスト表示されます。 -l と同時に引き数を与えると、引き数に対応するシグナルの名前がリスト表示さ れ、終了ステータスは 0 となります。 -l に対する引き数 exit_status は、シグナル番号、またはシグナルによっ て終了させられたプロセスの終了ステータスを指定する数です。 少なくとも 1 つのシグナルを正常に送ることができた場合、 kill は真を返します。エラーが起きた場合や不正なオプションがあった場合には、 kill は偽を返します。

let arg [arg ...]
    各 arg は評価される算術式( 算術式展開 を参照)です。 最後の arg を評価した結果が 0 であれば、 let は 1 を返します。それ以外の場合には、0 が返されます。

local [name[=value] ...]
    それぞれの引き数に対して、 name が示すローカル変数が生成され、 value が代入されます。 関数内で local を使った場合、この変数 name の可視スコープは、この関数とこの関数の子に制限されます。 オペランドが無い場合、 local はローカル変数の一覧を標準出力に出力します。関数の内部以外で local を使うとエラーになります。 local が関数の外部で使われたり、不正な name が与えられなければ、 local の返却ステータスは 0 となります。

logout
    ログインシェルを終了します。

popd [-n] [+n] [-n]
    ディレクトリスタックからエントリを削除します。引き数が無い場合には、ス タックからトップディレクトリが削除され、新しいトップディレクトリへの cd が実行されます。 引き数が指定された場合には、これは以下の意味を持ちます:
    +n  dirs で表示されるリストの左から数えて n 番目のエントリを削除します。 数えるのは 0 からです。例えば、``popd +0'' は最初のディレクトリを削除 し、``popd +1'' は 2 番目のディレクトリを削除します。
    -n  dirs で表示されるリストの右から数えて n 番目のエントリを削除します。 数えるのは 0 からです。例えば、``popd -0'' は最後のディレクトリを削除 し、``popd -1'' は最後の 1 つ前のディレクトリを削除します。
    -n  スタックからディレクトリを削除する際に、通常のディレクトリ変更を行いま せん。したがって、スタックだけが操作されます。

    popd コマンドが成功すれば、 dirs も実行され、終了ステータスは 0 となります。 popd が偽を返すのは、不正なオプションがあった場合、ディレクトリスタックが空 の場合、ディレクトリスタックの存在しないエントリが指定された場合、ディ レクトリ変更に失敗した場合です。

printf format [arguments]
    arguments を整形して標準出力に書き出します。フォーマットは format で制御します。format は 3 つのタイプのオブジェクト を含む文字列です。3 つのオブジェクトは、プレーン文字(そのまま標準出力 にコピーされます)、文字エスケープシーケンス(変換された標準出力にコピー されます)、フォーマット指定(それぞれ、後に続く引き数を出力します)です。 printf(1) 標準のフォーマットに加えて、%b を用いると printf は、対応する argument 中のバックスラッシュのエスケー プシーケンスを展開し、%q を用いるとprintf は、対応する argument をシェルの入力として再利用できるフォーマットで出力しま す。

    format は必要に応じて再利用し、全ての arguments を処理する ことができます。与えられたよりも多くの arguments を format が必要とする場合、追加のフォーマット指定は、0 か空文字列(適切な方)が指 定されたかのように動作します。

pushd [-n] [dir]
pushd [-n] [+n] [-n]
    ディレクトリをディレクトリのスタックに追加するか、スタックをローテート させます。この時、新しいスタックの最も上にあるものをカレントの作業ディ レクトリにします。引き数を与えなければ、一番上の 2 つのディレクトリを 交換し、0 を返します。ただし、ディレクトリスタックが空の場合を除きます。 引き数を与えた場合には、以下の意味を持ちます:
    +n  スタックをローテートさせ、n 番目のディレクトリを一番上にします。 このとき、 BR dirs が表示するリストは左から数え始め、その左端は 0 となります。
    -n  スタックをローテートさせ、n 番目( dirs が表示するリストの右から数えます。また、0 から数え始めます)のディレク トリを一番上にします。
    -n  ディレクトリをスタックに追加した時に、通常のディレクトリ変更を行いませ ん。したがって、スタックだけが操作されます。
    dir dir をディレクトリスタックの一番上に追加します。また、このディレクトリを新 しいカレントの作業ディレクトリにします。

    pushd コマンドが成功すれば、 dirs コマンドも実行されます。 最初の形式を使った場合には、 dir への cd が失敗しなければ、 pushd は 0 を返します。2 番目の形式を使った場合にも、 pushd は基本的には 0 を返します。ただし、ディレクトリスタックが空の場合、ディ レクトリスタックの存在しない要素が指定された場合、指定された新しいカレ ントディレクトリへのディレクトリ変更が失敗した場合は除きます。

pwd [-LP]
    現在の作業ディレクトリの絶対ファイル名を出力します。 -P オプションが指定された場合や、組み込みコマンド set の -o physical オプションが有効になっている場合には、出力されるファイル名には、シンボ リックリンクは含まれません。 -L オプションを使うと、シンボリックリンクが辿られます。カレントディレクト リの名前を読む際にエラーが起きたり、不正なオプションが与えられなければ、 返却ステータスは 0 となります。

read [-er] [-a aname] [-p prompt] [name ...]
    標準入力から 1 行を読み込み、最初の単語を最初の name に代入し、2 番目の単語を 2 番目の name に代入します。以降も同様です。余った単語とそれらの間の区切り文字は、最後の name に代入されます。 name よりも標準入力から読み込んだ単語の方が少ない場合には、余っている name には空文字列が値として代入されます。 IFS 中の文字は、行を単語にするために使われます。 バックスラッシュ文字(\)を使うと、次に読み込んだ文字の特殊な意味 を消したり、行を連結することができます。 オプションが与えられていれば、以下の意味を持ちます:
    -r  バックスラッシュはエスケープ文字として作用しません。バックスラッシュは 行の一部と見なされます。特に、バックスラッシュと改行の組合せを使って複 数の行を接続することはできません。
    -p  入力を読み込もうとする前にプロンプトを表示します。末尾に改行は付 きません。プロンプトが表示されるのは、入力を端末から読み込む場合だけで す。
    -a  単語を配列変数 aname にインデックス順に代入します。インデックスは 0 から始まります。 新しい値が代入される前には、 aname の設定は消されます。他の name 引き数は無視されます。
    -e  標準入力を端末から読み込む場合、 readline (前述の READLINE を参照)を使って行を取得します。

    names が全く与えられていない場合、読み込まれた行は変数 REPLY に代入されます。ファイル末尾に到達しなければ、終了コードは 0 です。

指定された name に読み込み専用の印を付けます。それ以降は、この
    ような name の値を変更することはできません。 -f オプションを与えた場合、name に対応する関数に同様の印が付きます。 -a オプションは、その変数を配列に制限します。 name 引き数が全く与えられてない場合、または -p オプションが与えられた場合、読み込み専用の名前全ての一覧が出力されます。 -p オプションを使うと、入力として再利用できるようなフォーマットで出力が行 われます。 返却ステータスは基本的に 0 ですが、不正なオプションがあった場合、 name のいずれかが有効なシェル変数名で無かった場合、 -f オプションに関数でない name を与えた場合は除きます。

return [n]
    指定した返り値 n で関数を終了させます。 n を省略すると、関数内で最後に実行したコマンドの終了ステータスが、関数の 終了ステータスになります。関数の外で使われたけれど, . (source) コマンドによるスクリプトの実行中だった場合は、シェルは そのスクリプトの実行を止め、 n またはスクリプト内で最後に実行されたコマンドの終了ステータスをスクリプ トの終了ステータスとして返します。関数の外側かつ、. によるスク リプトの実行中以外に使われた場合には、終了ステータスは偽となります。

set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
    オプション無しの場合は、シェル変数全ての名前と値の組が表示されます。表 示は、入力として再利用できるフォーマットで行われます。出力は現在のロケー ルに従ってソートされます。オプションが指定されている場合、オプションは シェルの属性を設定または解除します。オプションが処理された後に残ってい る引き数があれば、これは位置付きパラメータの値として扱われ、 $1, $2, ... $n の順に代入されます。 オプションが指定されていれば、以下の意味を持ちます:
    -a  これ以降、値を変更したり新規に設定したりした変数が、 自動的に環境変数として export されるようになります。
    -b  終了したバックグラウンドジョブのステータス報告を、次のプライマリプロン プトの前ではなく、即座に行います。これはジョブ制御が有効な場合に限り有 効です。
    -e  単純なコマンド(前述の シェルの文法 を参照)が 0 でないステータスで終了した場合、即座に終了します。ただし、 失敗したコマンドが until または while ループの一部である場合、 if 文の一部である場合、 && または || リストの一部である場合、コマンドの返り値が ! で反転されている場合には、シェルは終了しません。
    -f  パス名展開を無効にします。
    -h  実行の時に検索する場合と同じように、コマンドの位置を記憶します。これは デフォルトで有効になっています。
    -k  代入文の形式を持つ全ての引き数を、コマンドに対する環境変数とします。環 境変数となるのは、コマンド名のあるものに限りません。
    -m  監視モード。ジョブ制御は有効になります。ジョブ制御(前述の ジョブ制御 を参照)をサポートしているシステム上の対話シェルでは、このオプションは デフォルトで有効です。別のプロセスグループで実行されたバックグラウンド プロセスと、これらの終了ステータスが書かれた行が、プロセスの終了時に表 示されます。
    -n  コマンドを読み込みますが実行はしません。これを使うとシェルスクリプトの 文法エラーをチェックすることができます。このオプションは対話シェルでは 無視されます。
    -o option-name
        option-name には、以下のいずれかを指定することができます:
        allexport
            -a と同じです。
        braceexpand
            -B と同じです。
        emacs
            emacs 形式のコマンド行編集インタフェースを使います。これはシェルが対話 的な場合には、デフォルトで有効です。ただし、 --noediting オプション付きでシェルを実行した時は除きます。
        errexit
            -e と同じです。
        hashall
            -h と同じです。
        histexpand
            -H と同じです。
        history
            コマンド履歴を有効にします。コマンド履歴については、既に 履歴 で説明しています。このオプションは、対話シェルではデフォルトで有効です。
        ignoreeof
            効果は、シェルコマンドの IGNOREEOF=10 を実行した場合と同様です (前述の シェル変数 を参照してください)。
        keyword
            -k と同じです。
        monitor
            -m と同じです。
        noclobber
            -C と同じです。
        noexec
            -n と同じです。
        noglob
            -f と同じです。
        notify
            -b と同じです。
        nounset
            -u と同じです。
        onecmd
            -t と同じです。
        physical
            -P と同じです。
        posix
            bash の動作を変えます。デフォルトの操作は POSIX 1003.2 標準と異なりますが、 これを標準に準拠するようにします。
        privileged
            -p と同じです。
        verbose
            -v と同じです。
        vi  vi 形式のコマンド行編集インタフェースを使います。
        xtrace
            -x と同じです。

        option-name 無しで -o オプションを与えた場合、現在のオプションが出力されます。 option-name 無しで +o オプションを与えた場合、現在のオプション設定を再生成する set コマンドの列が標準出力に出力されます。
    -p  特権(privileged) モードを有効にします。このモードでは、 $ENV と $BASH_ENV ファイルは処理されず、シェル関数は環境から継承されず、SHELLOPTS 環境変数は定義されていても無視されます。 シェルを起動した時に実効ユーザ(グループ) ID が実ユーザ(グループ) ID と 異なり、かつ -p オプションが与えられていない場合、これらの動作 が行われ、実効ユーザ ID には実ユーザ ID が設定されます。 起動時に -p オプションが与えられた場合、実効ユーザ ID は再設定 されません。 このオプションを無効にすると、実効ユーザ ID と実効グループ ID には実ユー ザ ID と 実グループ ID が設定されます。
    -t  コマンドを 1 つ読み込み、実行してから終了します。
    -u  パラメータ展開の実行中に、設定が取り消されている変数をエラーとして扱い ます。設定が取り消されている変数を展開しようとした場合、シェルはエラー メッセージを出力します。シェルが対話的でなければ、0 でないステータスで 終了します。
    -v  シェルの入力行を読み込んだ際に表示します。
    -x  単純なコマンドをそれぞれ展開した後、 PS4 を展開した値を表示し、その後にこのコマンドと展開した引き数を表示します。
    -B  シェルはブレース展開(前述の ブレース展開 を参照)を実行します。これはデフォルトで有効です。
    -C  設定されている場合、 bash はリダイレクション演算子 >, >&, <> で既存のファイルを上書きしません。上書きができるのは、 リダイレクション演算子 >| を > の代わりに使った時です。
    -H  ! 形式の履歴置換を有効にします。このオプションは、シェルが対話的な時には デフォルトで有効です。
    -P  設定されている場合、 cd のような現在の作業ディレクトリを変更するコマンドを実行する時に、シェル はシンボリックリンクを辿りません。代わりに物理的ディレクトリ構造が使わ れます。デフォルトでは、 bash がカレントディレクトリを変更するコマンドを実行する際には、ディレクトリ の論理的な接続が辿られます。
    --  このオプションの後に引き数が続いていない場合には、位置付きパラメータの 設定が取り消されます。それ以外の場合には、位置付きパラメータに arg が設定されます。引き数に - で始まるものが含まれていても、オプションではなく位置付きパラメータとし て扱われます。
    -   オプションの終わりを示します。残りの arg は全て位置付きパラメー タに代入されます。 -x オプションと -v オプションは無効になります。arg が無い場合には、位置付きパラメー タの内容は変化しません。

    特に断らない限り、各オプションはデフォルトで無効になっています。- の 代わりに + を使うと、これらのオプションは無効になります。オプションは シェルを起動する際の引き数としても指定することができます。現在のオプショ ンの集合は、 $- で知ることができます。不正なオプションが無ければ、終了ステータスは必ず 真となります。

shift [n]
    n+1 ... からの位置付きパラメータの名前を変え、 $1 ... とします。$# から $#-n+1 までの数字で表されるパラメー タの設定は消されます。 n は 0 以上 $# 以下の数でなければなりません。 n が 0 ならば、どのパラメータも変更されません。 n が与えられない場合には、1 が指定されたものと見なされます。 n が $# より大きい場合、位置付きパラメータは変化しません。 n が $# より大きい場合や 0 より小さい場合には、返却ステータスは 0 より大きい数 になります。それ以外の場合には 0 になります。

shopt [-pqsu] [-o] [optname ...]
    シェルのオプション動作を制御する変数の値をトグルさせます。オプションが 無い場合や、 -p オプションが指定されている場合には、設定可能なオプション全てのリストが 表示されます。表示の際には、それぞれが設定されているかどうかも示されま す。-p オプションが指定されていると、オプションの表示は、入力と して再利用できるフォーマットで行われます。その他のオプションは、以下の 意味を持っています:
    -s  optname をそれぞれ有効にします(設定します)。
    -u  optname をそれぞれ無効にします(設定解除します)。
    -q  通常の出力を止めます(静かなモード)。返却ステータスは、optname が 設定されているかどうかを示します。複数の optname 引き数と -q が指定されている場合には、全ての optnames が有効である時に返却ス テータスが 0 となります。それ以外の時には、0 でない値となります。
    -o  optname の値を、組み込みコマンド set の -o オプションで定義されているものに制限します。

    引き数 optname 無しで -s オプションまたは -u オプションを使った場合、表示されるものは設定されているもの、または設定 されていないものにそれぞれ制限されます。特に断らない限り、shopt オプションはデフォルトで無効(設定解除)になっています。

    オプションをリスト表示した時の返却ステータスは、全ての optnames が有効になっている場合は 0 となります。それ以外の場合には 0 でない値と なります。設定または設定取り消しのオプションの時には、optname が 不正なシェルオプションでなければ、返却ステータスは 0 となります。

    shopt オプションのリストを以下に示します:

    cdable_vars
        設定されている場合、組み込みコマンド cd への引き数でディレクトリでないものは変数の名前と見なされ、その値が変更 先のディレクトリとなります。
    cdspell
        設定されている場合、 cd コマンドのディレクトリ要素におけるスペルのちょっとした誤りは修正されま す。 チェックされる誤りは、文字の入れ替わり、文字の欠け、1 文字余分にあるこ とです。 訂正できた場合には、訂正後のファイル名が表示され、コマンドは続けて実行 されます。このオプションが使われるのは対話シェルだけです。
    checkhash
        設定されている場合、bash はハッシュ表で見つけたコマンドを実行す る前に実際に存在するかどうかをチェックします。ハッシュされているコマン ドが既に無くなっている場合、通常のパス検索が行われます。
    checkwinsize
        設定されている場合、bash はコマンドの実行後に毎回ウィンドウの大 きさをチェックし、必要に応じて LINES と COLUMNS の値を更新します。
    cmdhist
        設定されている場合、 bash は複数行に分かれているコマンドの全ての行を、同じ履歴エントリに保存しよ うとします。これを使うと、複数行に分かれているコマンドの再編集が容易に なります。
    dotglob
        設定されている場合、 bash は `.' で始まるファイル名をパス名展開の結果に含めます。
    execfail
        設定されている場合、 組み込みコマンド exec への引き数として指定されたファイルが実行できなくても、対話的でないシェ ルが終了しません。対話シェルは exec に失敗しても終了しません。
    expand_aliases
        設定されている場合、エイリアスが前述の エイリアス で説明したように展開されます。このオプションは、対話的なシェルではデフォ ルトで有効です。
    extglob
        設定されている場合、拡張されたパターンマッチング機能が有効になります。 これについては、前述のパス名展開で説明しています。
    histappend
        設定されている場合、シェルの終了時に履歴リストが変数 HISTFILE の値で指定しているファイルに追加されます。ファイルへの上書きは行われな くなります。
    histreedit
        この変数が設定されており、かつ readline が使われている場合、ユーザは失敗した履歴置換を再編集することができます。
    histverify
        この変数が設定されており、かつ readline が使われている場合、履歴置換の結果は即座にはシェルのパーザに渡されませ ん。その代わり、結果として得られた行は readline の編集バッファに 読み込まれ、さらに修正することができます。
    hostcomplete
        この変数が設定されており、かつ readline が使われている場合、bash は@ を含む単語を補完する時にホス ト名補完を実行しようとします(前述の READLINE における 補完 を参照してください)。これはデフォルトで有効になっています。
    huponexit
        設定されている場合、bash は対話的なログインシェルを終了する時に、 全てのジョブに SIGHUP を送ります。
    interactive_comments
        設定されている場合、 # で始まる単語について、その単語とその行の残りの文字を対話シェルに無視さ せることができます(前述の コメント を参照してください)。このオプションはデフォルトで有効です。
    lithist
        設定されており、かつ cmdhist オプションが有効ならば、複数行に分かれているコマンドは、セミコロンで区 切られるのではなく、できる限り途中に改行を埋め込むことで履歴に保存され ます。
    mailwarn
        設定されており、かつ bash がメールをチェックするファイルが前回の チェック以降にアクセスされている場合、メッセージ ``The mail in mailfile has been read'' が表示されます。
    nocaseglob
        設定されている場合、 bash はパス名展開(前述の パス名展開 を参照)を行う時に、ファイル名の大文字と小文字を区別せずにマッチングを 行います。
    nullglob
        設定されている場合、 bash はどのファイルにもマッチ(前述の パス名展開 を参照)しないパターンを空文字列に展開します。その文字列自身には展開さ れなくなります。
    promptvars
        設定されている場合、プロンプト文字列に対して変数展開とパラメータ展開が 行われます。この展開は前述の プロンプト で説明した展開が行われた後に行われます。このオプションはデフォルトで有 効になっています。
    restricted_shell
        シェルが制限モードで起動された場合、このオプションが設定されます(後述 の 制限付きのシェル を参照してください)。この値は変更することはできません。 これは起動ファイルが実行される時にもリセットされないので、シェルが制限 付きかどうかを起動ファイル内部で知ることができます。
    shift_verbose
        設定されている場合、組み込みコマンド shift においてシフトの回数が位置付きパラメータの数を超えると、エラーメッセー ジが出力されます。
    sourcepath
        設定されている場合、組み込みコマンド source (.) は PATH の値を使って、引き数として与えられたファイルを含むディレクトリを見つけ ます。このオプションはデフォルトで有効です。
suspend [-f]
    SIGCONT シグナルを受け取るまで、シェルの実行をサスペンドします。 -f オプションを与えた場合、シェルがログインシェルであっても警告を出しませ ん。ただし、どちらにせよサスペンドはします。シェルがログインシェルであ り、かつ -f が与えられていない場合とジョブ制御が有効でない場合でなければ、返却ステー タスは 0 です。
test expr
[ expr ]
    条件式 expr を評価した結果に基づいて、ステータス 0 または 1 を返します。 それぞれの演算子とオペランドは別々の引き数でなければなりません。式は前 述の 条件式 で説明したプライマリで構成されます。

    式は以下に示す演算子を使って結合させることができます。リストは優先度の 高い順に示しています。
    ! expr
        expr が偽ならば真になります。
    ( expr )
        expr の値を返します。これを使って、通常の演算子の優先度を上書き することができます。
    expr1 -a expr2
        expr1 と expr2 が両方とも真ならば真になります。
    expr1 -o expr2
        expr1 と expr2 のいずれかが真ならば真になります。

    test and [ 引き数の数に基づいた規則の集合を用いて条件式を評価します。

    引き数が 0 個
        この式は偽です。
    引き数が 1 個
        引き数が空でない場合に限り真になります。
    引き数が 2 個
        最初の引き数が ! ならば、2 番目の引き数が空の場合に限り真になり ます。最初の引き数が、既に 条件式 で説明した単項条件演算子のいずれかであれば、単項の評価が真の場合に式は 真となります。最初の引き数が正しい単項条件演算子でなければ、式は偽とな ります。
    引き数が 3 個
        2 番目の引き数が、既に 条件式 で説明した二値条件演算子のいずれかであれば、最初と 3 番目の引き数をオ ペランドとして使った二値評価の結果が式の結果となります。最初の引き数が ! であれば、2 番目と 3 番目の引き数を使った、引き数 2 つの評価の 結果を否定したものが値となります。最初の引き数が ( であり、3 番 目の引き数が ) ならば、2 番目の引き数を使って引き数 1 つの評価を 行った値が結果となります。これら以外の場合には、式は偽となります。 この場合においては、-a と -o は二値演算子として扱われま す。
    引き数が 4 個
        最初の引き数が ! ならば、残りの引き数で作った引き数 3 つの式の値 を否定したものが結果となります。それ以外の場合には、先に挙げた規則を使っ た優先度に従って式が展開・評価されます。
    引き数が 5 個以上
        先に挙げた規則を使った優先度に従って式が展開・評価されます。

times
    シェルとシェルから実行したプロセスについて、ユーザ時間とシステム時間を 加えたものを出力します。返却ステータスは 0 です。

trap [-lp] [arg] [sigspec ...]
    シェルがシグナル sigspec を受け取った時、コマンド arg が読み込まれ、実行されます。 arg が存在しないか、 - である場合、 指定されているシグナルは全て最初の値(シェルの起動時に設定されていた値) にリセットされます。 arg が空文字列である場合、それぞれの sigspec で指定されているシグナルは、シェルとシェルが起動したコマンドから無視さ れます。 arg が -p ならば、 各 sigspec に対応する trap コマンドが表示されます。引き数が全く無いか、 -p だけが与えられた場合、 trap は各シグナル番号に対応するコマンドのリストを出力します。 それぞれの sigspec は、<signal.h> で定義されているシグナル名またはシグナル番号です。 sigspec が EXIT (0) であれば、シェルの終了時にコマンド arg が実行されます。 sigspec が DEBUG であれば、単純なコマンド(前述の シェルの文法 を参照)が終わるたびにコマンド arg が実行されます。 -l オプションを与えると、シェルはシグナル名とこれに対応する番号のリストを 出力します。 シェルのエントリで無視されるシグナルは、トラップすることもリセットする こともできません。トラップされたシグナルはリセットされ、子プロセスが生 成された時の最初の値に戻ります。 sigspec のいずれかが不正であれば、返却ステータスは偽になります。それ以外の場合 には、 trap は真を返します。

type [-atp] name [name ...]
    オプション無しの場合には、 name それぞれをコマンド名として使った時にどのように解釈されるかが示されます。 -t オプションを使うと、 type は alias, keyword, function, builtin, file いずれかの文字列を出力します。出力されるのは name がそれぞれ、エイリアス、シェルの予約語、関数、組み込みコマンド、ディス ク上のファイルの場合です。 name が見つからない場合は何も出力されず、偽の終了ステータスが返されます。 -p オプションを使うと、 type は、 name をコマンド名として指定した場合に実行されるディスクファイルの名前、ま たは空文字列を返します。空文字列が返されるのは、type -t name が file を返さない場合です。 コマンドがハッシュされている場合、 -p はハッシュされている値を表示します。表示されるのは、必ずしも PATH 中で最初に現われるファイルとは限りません。 -a オプションを使った場合、 type は name が示す実行ファイルがある場所を全て出力します。 -p オプションが同時に使われていない場合に限り、エイリアスや関数も出力され ます。 -a を使う時には、ハッシュされているコマンドの表は参照されません。 type は、引き数のいずれかが見つかれば真を返し、どれも見つからなければ偽を返 します。

ulimit [-SHacdflmnpstuv [limit]]
    これを使うと、シェルおよびシェルが起動するプロセスが利用できるリソース を制御できます。ただし、このような制御ができるシステムの場合に限ります。 limit の値はリソースに対して指定されている単位の数、または unlimited です。 -H オプションと -S オプションは、与えられたリソースに対 して強い(hard)制限や弱い(soft)制限を設定します。強い制限は一度設定する と増やすことができません。弱い制限は強い制限の値までは増やすことができ ます。-H と -S がどちらも指定されていない場合、強い制限 と弱い制限がどちらも設定されます。 limit を省略すると、リソースの弱い制限の現在値が表示されます。ただし、 -H が与えられている場合は除きます。複数のリソースが指定されてい る時は、制限名と単位が値の前に出力されます。他のオプションは以下のよう に解釈されます:
    -a  現在の制限を全て報告します
    -c  生成されるコアファイル(core)の最大サイズ
    -d  プロセスのデータセグメントの最大サイズ
    -f  シェルが生成できるファイルの最大サイズ
    -l  メモリにロックできる最大サイズ
    -m  常駐セットサイズの最大値
    -n  オープンできるファイルデスクリプタの最大数(ほとんどのシステムでは、こ の値を設定することはできません)
    -p  512 バイトブロック単位でのパイプのサイズ(これは設定できないかもしれま せん)
    -s  最大スタックサイズ
    -t  CPU 時間の最大量(秒単位)
    -u  1 人のユーザが使用できる最大のプロセス数
    -v  シェルが使用できる最大の仮想メモリ量

    limit が与えられている場合、これは指定されたリソースの新しい値となります( -a は表示専用です)。 オプションが全く与えられなかった場合は、 -f が指定されたものと見なされます。 値は 1024 バイト単位で増えますが、 秒単位である -t, 512 バイトのブロック単位である -p, 単位無しの値である -n および -u は除きます。返却ステータスは基本的に 0 ですが、不正なオプションがある 場合、unlimited 以外の数字でない引き数が limit に指定され た場合、新しい制限を設定する際にエラーが起きた場合は除きます。

umask [-p] [-S] [mode]
    ユーザのファイル生成マスクに mode を設定します。 mode が数字で始まる場合には、これは 10 進数と解釈されます。それ以外の場合に は、 chmod(1) に指定するのと同様のシンボリックなモードマスクと解釈されます。 mode が省略されるか、 -S オプションが与えられると、現在のマスクの値が出力されます。 -S オプションを指定すると、マスクはシンボリックな形式で表示されます。デフォ ルトの出力は 10 進の数値です。 -p オプションが指定され、かつ mode が省略された場合、入力として際利用できる形式で出力が行われます。モード が正常に変更できた場合や、mode 引き数が全く与えられなかった場合 には、返却ステータスは 0 となります。それ以外の場合には偽となります。

unalias [-a] [name ...]
    name を定義されているエイリアスのリストから削除します。 -a が与えられている場合には、エイリアス定義は全て削除されます。与えられた name が定義されているエイリアスであれば、返却ステータスは真になります。

unset [-fv] [name ...]
    name それぞれについて、対応する変数や関数を削除します。 オプションが全く与えられていない場合や、 -v オプションが与えられた場合は、各 name はシェル変数を参照します。 読み込み専用の変数の設定を消すことはできません。 -f が指定されている場合、各 name はシェル関数を参照し、その関数の定義が削除されます。 設定が消された変数や関数は全て、それ以降のコマンドに渡される環境変数か らも削除されます。 RANDOM, SECONDS, LINENO, HISTCMD, DIRSTACK のいずれかの設定を消した場合、これらの特殊な特性も無くなります。これは 後で再設定しても元に戻ることはありません。 name が存在しないか、読み込み専用の場合以外には、終了ステータスは真となりま す。

wait [n]
    指定されたプロセスを wait し、その終了ステータスを返します。 n はプロセス ID またはジョブ指定です。ジョブ指定を与えた場合、そのジョブ のパイプラインに含まれる全てのプロセスを wait します。 n が与えられていない場合には、現在アクティブな全ての子プロセスを wait し、 返却ステータスは 0 となります。 n が存在しないプロセスやジョブを指定している場合、返却ステータスは 127 になります。それ以外の場合、返却ステータスは wait していた最後のプロセ スまたはジョブの終了ステータスとなります。

制限付きのシェル(RESTRICTED SHELL)

bash を rbash という名前で起動した場合や、起動時に -r オプションを指定した場合には、シェルは制限された状態になります。制限付 きのシェルは、標準のシェルよりも細かく制御された環境を設定したいときに 用います。 制限付きのシェルは bash と全く同じように動作しますが、以下のようなことが許可されなかったり実行 されなかったりします:

•   cd を使ってディレクトリを変更すること

•   SHELL, PATH, ENV, BASH_ENV の値の設定や設定取り消しを行なうこと

•   / を含むコマンド名を指定すること

•   組み込みコマンド . の引き数として / を含むファイル名を指定すること

•   起動時にシェル環境から関数定義をインポートすること

•   起動時にシェル環境から SHELLOPTS の値を展開すること

•   リダイレクション演算子 >, >|, <>, >&, &>, >> を使ってリダイレクトを行 なうこと

•   組み込みコマンド exec を用いて、シェルを別のコマンドに置き換えること

•   組み込みコマンド enable に対する -f オプションと -d オプションを使って、組み込みコマンドを追加・削除すること

•   組み込みコマンド command に -p オプションを指定すること

•   set +r や set +o restricted を用いて制限モードを解除するこ と

これらの制限は、何らかの起動ファイルを読み込んだ後に適用されます。

シェルスクリプトであると判明したファイルが実行された時(前述の コマンドの実行 を参照)には、 rbash はスクリプトを実行するために立ち上げたシェルでは制限を全て無効にします。

関連項目
Bash Features, 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.ai.MIT.Edu

Chet Ramey, Case Western Reserve University
chet@ins.CWRU.Edu

BUG REPORTS
bash のバグを見つけたら必ず報告してください。ただし報告の前には、それが本当 にバグであることと、バグが最新バージョンの bash で起こることを確かめてください。

本当にバグがあると判断した場合には、 bashbug コマンドを使ってバグ報告を行います。バグを修正してくださった場合には、 ぜひその内容も一緒にメールしてください! 提案や「哲学上の」バグ報告は、bug-bash@gnu.org にメールしたり、 ニュースグループの gnu.bash.bug に投稿してくださっても構いません。

バグ報告には必ず以下のことを書いてください:

bash のバージョン
ハードウェアとオペレーティングシステム
コンパイルに使ったコンパイラ
バグ動作の説明
バグを再現できる簡単なシェルスクリプトまたは「レシピ」

bashbug コマンドは、バグレポートを送るために用意されているテンプレートに、最初 の 3 項目を自動的に書き込みます。

このオンラインマニュアルに関するコメントやバグ報告は chet@ins.CWRU.Edu 宛にお願いします。

バグ

bash は大きすぎるし、遅すぎます。

bash と昔ながらのバージョンの sh にはちょっとした違いがいくつかあります。この大部分は POSIX の仕様のせいで生じたものです。

使い方によっては、エイリアスは混乱の元になります。

シェル組み込みコマンドとシェル関数は停止・再実行を行うことができません。

複合コマンドや `a ; b ; c' の形式のコマンド列は、プロセスのサスペンドを 行う際に綺麗に扱うことができません。プロセスを停止すると、シェルはコマ ンド列の次のコマンドを即座に実行するからです。 この問題はコマンド列を括弧の中に置いてサブシェルに実行させることで解決 できます。こうすれば、一まとまりのものとして止めることができます。

$(...) を使ったコマンド置換の内部にあるコマンドは、置換を 実行する時まで展開されません。これにより、コマンドを入力してしばらく経 つまでエラー出力が遅れます。

配列変数は(まだ)エクスポートすることができません。