bashマニュアルとサンプル

目次

実行形式と概要

bash [options] [file]

Bash は、標準入力またはファイルから読み取ったコマンドを実行する、sh 互換のコマンド言語インタープリターです。 Bash には、Korn および C シェル (ksh および csh) の便利な機能も組み込まれています。

Bash は、IEEE POSIX 仕様 (IEEE 標準 1003.1) のシェルおよびユーティリティ部分の適合実装を意図しています。 Bash は、デフォルトで POSIX 準拠になるように構成できます。

オプション

組み込みコマンド set の説明に記載されている 1 文字のシェル オプションに加えて、bash は起動時に次のオプションを解釈します。

-c string
-c オプションが存在する場合、コマンドは string から読み取られます。 文字列の後に引数がある場合、それらは $0 から始まる位置パラメータに割り当てられます。
1$ bash -c "bash --version"
2GNU bash, version 3.2.57(1)-release (arm64-apple-darwin22)
3Copyright (C) 2007 Free Software Foundation, Inc.
-i
-i オプションが存在する場合、シェルは対話型です。
-l
ログイン シェルとして呼び出されたかのように bash を動作させます (INVOCATIONを参照)。
-r
-r オプションが存在する場合、シェルは制限されます (RESTRICTED SHELLを参照)。
-s
-s オプションが存在する場合、またはオプション処理後に引数が残っていない場合、コマンドは標準入力から読み取られます。 このオプションを使用すると、対話型シェルを呼び出すときに位置パラメータを設定できます。
-v
シェル入力行を読み取ったときに表示します。
1$ cat sample.sh
2#!/bin/bash
3echo "Hello world!"
4$ bash -v sample.sh
5#!/bin/bash
6echo "Hello world!"
7Hello world!
8$ 
-D
$ で始まるダブルクォートで囲まれたすべての文字列のリストが標準出力に出力されます。 これらは、現在のロケールが C または POSIX でない場合に言語翻訳の対象となる文字列です。 これは -n オプションを意味します。 コマンドは実行されません。
[-+]O [shopt_option]
shopt_option は、組み込みコマンド shopt が受け入れるシェル オプションの 1 つです (BUILTIN COMMANDSを参照)。 shopt_option が存在する場合、-O はそのオプションの値を設定します。+O は設定を解除します。 shopt_option が指定されていない場合、shopt が受け入れるシェル オプションの名前と値が標準出力に表示されます。 呼び出しオプションが +O の場合、出力は入力として再利用できる形式で表示されます。
--
-- はオプションの終了を通知し、以降のオプション処理を無効にします。 -- の後の引数は、ファイル名および引数として扱われます。 - の引数は -- と同等です。

Bash は、多数の複数文字オプションも解釈します。 これらのオプションは、1 文字のオプションが認識される前にコマンド ラインに指定する必要があります。

--debugger
シェルが起動する前にデバッガー プロファイルが実行されるように調整します。 拡張デバッグ モード (組み込みコマンド shopt の extdebug オプションの説明を参照) とシェル関数のトレース (組み込みコマンド set の -o functrace オプションの説明を参照) をオンにします。
--dump-po-strings
-D と同等ですが、出力は GNU gettext po (ポータブル オブジェクト) ファイル形式です。
--dump-strings
-D と同等です。
--help
標準出力に使用法メッセージを表示し、正常に終了します。
--init-file file
--rcfile file
シェルが対話型の場合、標準の個人用初期化ファイル ~/.bashrc の代わりにfileからコマンドを実行します (INVOCATIONを参照)。
--login
-l と同等です。
--noediting
シェルが対話型の場合、GNU readline ライブラリを使用してコマンド ラインを読み取らないでください。
--noprofile
システム全体の起動ファイル /etc/profile も、個人の初期化ファイル ~/.bash_profile、~/.bash_login、または ~/.profile も読み取らないでください。 デフォルトでは、bash はログイン シェルとして呼び出されたときにこれらのファイルを読み取ります (INVOCATIONを参照)。
--norc
シェルが対話型の場合、個人の初期化ファイル ~/.bashrc を読み取って実行しません。 シェルが sh として呼び出される場合、このオプションはデフォルトでオンになっています。
--posix
デフォルトの動作が POSIX 標準と異なる bash の動作を標準 (posix モード) に一致するように変更します。
--restricted
シェルが制限されます (RESTRICTED SHELLを参照)。
--verbose
-v と同等です。
--version
この bash インスタンスのバージョン情報を標準出力に表示し、正常に終了します。
1$ bash --version
2GNU bash, version 3.2.57(1)-release (arm64-apple-darwin22)
3Copyright (C) 2007 Free Software Foundation, Inc.
4$ 

引数 (ARGUMENTS)

オプションの処理後に引数が残っていて、-c オプションも -s オプションも指定されていない場合、最初の引数はシェル コマンドを含むファイルの名前であると見なされます。 この方法で bash が呼び出されると、$0 がファイルの名前に設定され、位置パラメータが残りの引数に設定されます。 Bash は、このファイルからコマンドを読み取って実行し、終了します。 Bash の終了ステータスは、スクリプトで実行された最後のコマンドの終了ステータスです。 コマンドが実行されない場合、終了ステータスは 0 です。最初に現在のディレクトリでファイルを開こうとします。ファイルが見つからない場合、シェルは PATH 内のディレクトリでスクリプトを検索します。

呼び出し(INVOCATION)

(こちらの記事が詳しい → bash の初期化ファイル .profile, .bashrc, .bash_profile の使い分けと管理方針

ログイン シェルは、引数 0 の最初の文字が - であるシェル、または --login オプションで開始されるシェルです。

  • ※ システムへログイン、再ログインするような、ユーザセッションの開始時に起動するシェルがログインシェルになる。
    • ログインプロンプトよりシステムにログイン
    • bash --login のように --login オプションを明示して bash を起動
    • su - のように -(-lまたは--login)オプションを指定した場合、su コマンドがシェル名の前に - を付加
    • ssh user@hostname などでSSHログイン
  • shopt login_shell を参照。このコマンドでログインシェルとして開始されたものであるかの確認が可能。

インタラクティブ(対話型)シェルとは、オプション以外の引数が指定されてなく、 -c オプションなしで開始され、標準入力と標準エラー出力が両方とも端末に接続されている ( isatty(3) によって決定される) シェル、または -i オプションで開始されたシェルです。 bash が対話型の場合には、PS1 が設定され、 $-i が含まれます。これを利用すると、インタラクティブな状態であるかどうかを、シェルスクリプトまたは起動ファイルの内部でテストできます。

  • ※出力は端末画面に表示されて、対話的に入力を受け付け、シェルスクリプトを実行するために起動されたシェルではない場合にインタラクティブシェルとなる。
    • 仮想コンソールや ssh によるログイン
    • su [user] のように - 無しで substitute user した場合
    • bash としてシェルを起動
    • bash -i でシェルスクリプトを実行

次の段落では、bash がそのスタートアップ ファイルを実行する方法について説明します。 いずれかのファイルが存在するが読み取ることができない場合、bash はエラーを報告します。 チルダは、以下の EXPANSION セクションのチルダ展開で説明されているように、ファイル名で展開されます。

bash が対話型ログイン シェルとして、または --login オプションを指定した非対話型シェルとして呼び出されると、最初にファイル /etc/profile からコマンドを読み取り、実行します (そのファイルが存在する場合)。 そのファイルを読み取った後、~/.bash_profile、~/.bash_login、および ~/.profile をこの順序で検索し、最初に存在して読み取り可能なコマンドからコマンドを読み取って実行します。 --noprofile オプションは、シェルの起動時にこの動作を禁止するために使用できます。

ログイン シェルが終了すると、bash はファイル ~/.bash_logout (存在する場合) からコマンドを読み取り、実行します。

ログイン シェルではないインタラクティブ シェルが開始されると、bash は ~/.bashrc ファイルが存在する場合はそこからコマンドを読み取り、実行します。 これは、 --norc オプションを使用することで抑制できます。 --rcfile file オプションを指定すると、bash は ~/.bashrc ではなく、fileからコマンドを読み取って実行するようになります。

たとえば、bash が非対話的に開始されると、シェル スクリプトを実行するために、環境内で変数 BASH_ENV が検索され、そこに表示される場合はその値が展開され、展開された値がファイルの名前として使用され、読み取られて実行されます。Bash は、次のコマンドが実行されたかのように動作します。

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

ただし、PATH 変数の値はファイル名の検索には使用されません。

bash が sh という名前で呼び出された場合、POSIX 標準にも準拠しながら、sh の歴史的なバージョンの起動動作を可能な限り模倣しようとします。 対話型ログイン シェル、または --login オプションを指定した非対話型シェルとして呼び出されると、最初に /etc/profile および ~/.profile からコマンドをこの順序で読み取って実行しようとします。 --noprofile オプションを使用して、この動作を禁止できます。 sh という名前で対話型シェルとして呼び出されると、bash は変数 ENV を探し、定義されている場合はその値を展開し、展開された値をファイルの名前として使用して読み取り、実行します。 sh として呼び出されたシェルは、他の起動ファイルからコマンドを読み取って実行しようとしないため、 --rcfile オプションは効果がありません。 sh という名前で呼び出された非対話型シェルは、他の起動ファイルを読み取ろうとしません。 sh として呼び出された場合、bash は起動ファイルが読み取られた後に posix モードに入ります。

--posix コマンド ライン オプションを使用して bash を posix モードで起動すると、起動ファイルの POSIX 標準に従います。 このモードでは、対話型シェルが ENV 変数を展開し、展開された値の名前を持つファイルからコマンドが読み取られて実行されます。 他のスタートアップ ファイルは読み込まれません。

Bash は、リモート シェル デーモン (通常は rshd) によっていつ実行されているかを判断しようとします。 bash は、rshd によって実行されていると判断した場合、~/.bashrc ファイルが存在し、読み取り可能であれば、そこからコマンドを読み取り、実行します。 sh として呼び出された場合、これは行われません。 --norc オプションを使用してこの動作を禁止したり、 --rcfile オプションを使用して別のファイルを強制的に読み取ったりすることができますが、rshd は通常、これらのオプションを使用してシェルを呼び出したり、指定することを許可したりしません。

実際のユーザー (グループ) ID と等しくない実効ユーザー (グループ) ID でシェルが開始され、-p オプションが指定されていない場合、起動ファイルは読み取られず、シェル関数は環境から継承されず、SHELLOPTS 変数が環境に現れた場合は無視され、有効なユーザー ID は実際のユーザー ID に設定されます。 ユーザーID。 呼び出し時に -p オプションが指定されている場合、始動時の動作は同じですが、実効ユーザー ID はリセットされません。

定義 (DEFINITIONS)

次の定義は、このドキュメントの残りの部分で使用されます。

ブランク (blank)
スペースまたはタブ。
単語 (word)
シェルによって 1 つの単位と見なされる一連の文字。 トークンとも呼ばれます。
名前 (name)
英数字とアンダースコアのみで構成され、英字またはアンダースコアで始まる単語。 識別子とも呼ばれます。
メタ文字 (metacharacter)
引用されていない場合に単語を区切る文字。 次のいずれかです。
| & ; ( ) < > space tab
制御演算子 (control operator)
制御機能を実行するトークン。 次の記号のいずれかです。
|| & && ; ;; ( ) | <newline>

予約語 (RESERVED WORDS)

次の定義は、このドキュメントの残りの部分で使用されます。 予約語は、シェルにとって特別な意味を持つ単語です。 次の単語は、引用符で囲まれておらず、単純なコマンド (SHELL GRAMMARを参照) の最初の単語、または case または for コマンドの 3 番目の単語のいずれかである場合、予約語として認識されます。

! case do done elif else esac fi for function if in select then until while { } time [[ ]]

シェル文法 (SHELL GRAMMAR)

単純なコマンド(Simple Commands)

単純なコマンドは、変数への代入を並べたもの(これは省略可能です)の後に、空白で区切られた単語とリダイレクトが続き、制御演算子で終了します。 最初の単語は実行するコマンドを指定し、引数 0 として渡されます。 残りの単語は、呼び出されたコマンドに引数として渡されます。 単純なコマンドの戻り値は、その終了ステータス、またはコマンドがシグナル n によって終了した場合は 128+n です。

単純なコマンド展開(SIMPLE COMMAND EXPANSION)も参照してください。

1$ echo $TZ
2$ date
32023年 2月 22日 水曜日 19:00:00 JST
4$ TZ=UTC date
52023年 2月 22日 水曜日 10:00:00 UTC
6$ echo $TZ  # シンプルコマンドの代入は引き継がれない
7$

パイプライン (Pipelines)

パイプラインは、文字 | で区切られた 1 つ以上のコマンドを並べたものです。 パイプラインの形式は次のとおりです。

[time [-p]] [ ! ] command [ | command2 ... ]

command の標準出力は、パイプを介して command2 の標準入力に接続されます。 この接続は、コマンドで指定されたリダイレクトの前に実行されます (REDIRECTIONを参照)。

パイプラインの戻りステータスは、pipefail オプションが無効になっている場合(デフォルト)、最後のコマンドの終了ステータスです。 pipefail が有効になっている場合、最後 (右端) のコマンドがゼロ以外のステータスで終了するか、すべてのコマンドが正常に終了した場合はゼロになります。予約語 ! がパイプラインの前にある場合、そのパイプラインの終了ステータスは、上記の終了ステータスの論理否定です。 シェルは、値を返す前に、パイプライン内のすべてのコマンドが終了するのを待ちます。

time 予約語がパイプラインの前にある場合、パイプラインの終了時に、その実行によって消費された経過時間とユーザー時間およびシステム時間が報告されます。 -p オプションは、出力形式を POSIX で指定された形式に変更します。TIMEFORMAT 変数は、タイミング情報の表示方法を指定するフォーマット文字列に設定できます。 以下のシェル変数の TIMEFORMAT の説明を参照。

パイプライン内の各コマンドは、個別のプロセスとして (つまり、サブシェル内で) 実行されます。

※下の動画でわかるように、パイプラインの右側のコマンドは、左側のコマンドの完了を待っているわけではなく、左側コマンドの出力が終わるまで随時その出力を受け取って処理している。つまり並行稼働している。

また、以下の例では、while コマンドはパイプラインで受け取った 1, 2, 3 の合計を計算しているが、サブシェルで実行されているので親シェルの変数 sum に影響を与えず、親シェルの sum は 0 のままである。パイプラインの代わりにプロセス置換を使用すると、親シェルで計算結果を利用できる。(プロセス置換を使った例を参照)

1$ sum=0; echo -e "1\n2\n3" | while read val; do ((sum+=val)); echo $sum; done; echo $sum
21
33
46
50

リスト (Lists)

リストは、演算子 ; & && または || のいずれかで区切られた 1 つ以上のパイプラインを並べたものであり、オプションで ; & または <newline> のいずれかで終了します。

これらのリスト演算子のうち、&& と || の優先順位は等しく、その後に ; と & が続きます。 ; と & は優先順位が同じです。

コマンドを区切るために、セミコロンの代わりに 1 つ以上の一連の改行がリストに表示される場合があります。

コマンドが制御演算子 & によって終了された場合、シェルはサブシェルのバックグラウンドでコマンドを実行します。 シェルはコマンドの終了を待たず、戻りステータスは 0 です。コマンドは ; で区切られ、順次実行されます。 シェルは、各コマンドが順番に終了するのを待ちます。 戻りステータスは、最後に実行されたコマンドの終了ステータスです。

制御演算子 && と || は、それぞれ AND リストと OR リストを表します。 AND リストの形式は次のとおりです。

command1 && command2

command2 は、command1 がゼロの終了ステータスを返す場合にのみ実行されます。

OR リストの形式は次のとおりです。

command1 || command2

command2 は、command1 がゼロ以外の終了ステータスを返した場合にのみ実行されます。 AND および OR リストの戻りステータスは、リストで実行された最後のコマンドの終了ステータスです。

複合コマンド (Compound Commands)

複合コマンドは、次のいずれかです。

(list)
list はサブシェル環境で実行されます (COMMAND EXECUTION ENVIRONMENTを参照)。 シェルの環境に影響を与える変数の代入と組み込みコマンドは、コマンドの完了後は有効になりません。 戻りステータスはリストの終了ステータスです。
 1$ # ファイルリストの左側にパスを付けない方法の例
 2$ pwd               # 現在ディレクトリは/tmp
 3/tmp
 4$ ls -1 dir1/*      # ディレクトリdir1に対してls実行すると、出力結果に'dir1/'が付く
 5dir1/sample.txt
 6dir1/sample2.txt
 7$ (cd dir1;ls -1 *) # ()内で一時的にdir1にcdしてls実行すれば、'dir1/'は付かない
 8sample.txt
 9sample2.txt
10$ pwd               # ()内の実行はサブシェル実行なので、現在ディレクトリは変わらない
11/tmp
{ list; }
list は、現在のシェル環境で単純に実行されます。リストは改行またはセミコロンで終了する必要があります。 これは、グループ コマンドと呼ばれます。 戻りステータスはリストの終了ステータスです。 メタ文字 ( および ) とは異なり、{ および } は予約語であり、予約語の認識が許可されている場所で使用する必要があることに注意してください。これらは単語の区切りを生じさせないため、リストから空白で区切る必要があります。
((expression))
expressionは、算術評価の規則に従って評価されます。 式の値がゼロ以外の場合、戻りステータスは 0 です。 それ以外の場合、戻りステータスは 1 です。これは let "expression" とまったく同じです。
1$ val=2; ((val+=3)); echo $val
25
3$ ((0)) && echo "test"  # 戻りステータスは 1
4$ ((1)) && echo "test"  # 戻りステータスは 0
5test
6$ ((-1)) && echo "test"  # 戻りステータスは 0
7test
[[ expression ]]
条件式 expression の評価に応じて、0 または 1 のステータスを返します。 式は条件式(CONDITIONAL EXPRESSIONS)で説明するプライマリで構成されます。 [[ と ]] の間の単語では、単語の分割とパス名の展開は実行されません。 チルダ展開、パラメータと変数の展開、算術展開、コマンド置換、プロセス置換、および引用符の削除が実行されます。 -f などの条件演算子は、プライマリとして認識されるように引用符で囲まれていない必要があります。
1$ echo "Here are some details about bash" > "Bash Manual"
2$ FILE="Bash Manual"
3$ [[ -f $FILE ]] && cat "$FILE"  # 単語は分割されないので引用符は不要(括っても削除される)
4Here are some details about bash

== および != 演算子が使用されている場合、演算子の右側にある文字列はパターンと見なされ、以下のパターンマッチングで説明されているルールに従って一致します。 シェル オプション nocasematch が有効な場合、一致はアルファベットの大文字と小文字に関係なく実行されます。 文字列がパターンに一致する (==) または一致しない (!=) 場合、戻り値は 0 になり、それ以外の場合は 1 になります。 パターンの任意の部分を引用符で囲んで、強制的に文字列として一致させることができます。

== および != と同じ優先順位で、追加の二項演算子 =~ を使用できます。 これを使用すると、演算子の右側の文字列は拡張正規表現と見なされ、それに応じて一致します (regex(3) と同様)。 文字列がパターンに一致する場合、戻り値は 0 になり、そうでない場合は 1 になります。 正規表現が構文的に正しくない場合、条件式の戻り値は 2 です。 シェル オプション nocasematch が有効な場合、一致はアルファベットの大文字と小文字に関係なく実行されます。 正規表現内の括弧で囲まれた部分式に一致する部分文字列は、配列変数 BASH_REMATCH に保存されます。 インデックス 0 の BASH_REMATCH の要素は、正規表現全体に一致する文字列の部分です。 インデックス n を持つ BASH_REMATCH の要素は、n 番目の括弧で囲まれた部分式に一致する文字列の部分です。

 1$ cat sample.sh
 2#!/bin/bash
 3DATE=$(date +'%Y-%m-%d')
 4
 5if [[ $DATE =~ ^([0-9]+)-([0-9]+)-([0-9]+)$ ]];then
 6  echo ${BASH_REMATCH[@]}
 7  echo ${BASH_REMATCH[0]},${BASH_REMATCH[1]},${BASH_REMATCH[2]},${BASH_REMATCH[3]}
 8fi
 9$ ./sample.sh
102023-07-22 2023 07 22
112023-07-22,2023,07,22

式は、次の演算子を使用して組み合わせることができます。優先度の高い順にリストされています。
( expression )
式の値を返します。 式をグループ化して、演算子の通常の優先順位を変更するために使用できます。
! expression
expressionが false の場合は true。
expression1 && expression2
expression1 とexpression2 の両方が true の場合は true。
expression1 || expression2
expression1 またはexpression2 のいずれかが true の場合は true。
for name [ in word ] ; do list ; done
wordのリストが展開され、アイテムのリストが生成されます。 このリストの各要素が順番に変数名nameに設定され、その都度 list が実行されます。 in ワードが省略されている場合、for コマンドは、設定されている位置パラメータごとに list を 1 回実行します (PARAMETERSを参照)。 戻りステータスは、実行された最後のコマンドの終了ステータスです。 in に続く項目の展開が空のリストになる場合、コマンドは実行されず、戻りステータスは 0 になります。

以下は 1 から 10 までの数字を出力する例です。

1for i in $(seq 10)
2do
3    echo $i
4done
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
最初に、算術式 expr1 は、算術評価の規則に従って評価されます。算術式 expr2 は、評価結果がゼロになるまで繰り返し評価されます。 expr2 がゼロ以外の値に評価されるたびに、list が実行され、算術式 expr3 が評価されます。 いずれかの式が省略されている場合、それは 1 に評価されるかのように動作します。戻り値は、実行されたリスト内の最後のコマンドの終了ステータス、またはいずれかの式が無効な場合は false です。

以下は 1 から 10 までの数字を出力する例です。

1for ((i = 1; i <= 10; i++))
2do
3    echo $i
4done
select
select 構造を使用すると、メニューを簡単に生成できます。 構文は for コマンドとほぼ同じです。
select name [in words …]; do commands; done

in に続く単語のリストが展開されて項目のリストが生成され、展開された単語のセットが標準エラー出力ストリームに出力され、それぞれの前に数字が付けられます。 'in words' を省略すると、'in "$@"' が指定されたかのように位置パラメータが出力されます。 select は PS3 プロンプトを表示し、標準入力から行を読み取ります。 行が表示された単語の 1 つに対応する数字で構成されている場合、name の値はその単語に設定されます。 行が空の場合は、単語とプロンプトが再度表示されます。 EOF が読み取られると、選択コマンドは完了し、1 を返します。その他の値が読み取られると、name が null に設定されます。 読み取られた行は変数 REPLY に保存されます。

リストは、break コマンドが実行されるまで、各選択後に実行されます。

select の終了ステータスは、listで実行された最後のコマンドの終了ステータス、またはコマンドが実行されなかった場合はゼロです。

以下は、ユーザーがカレントディレクトリにあるファイルをもとに、メニューを自動生成する例です。 メニュー表示に続いて PS3 プロンプトが表示されます。 その後 2 を入力しています。

1$ PS3="select item: "
2$ ls
3file1   file2   file3
4$ select fname in * ; do echo you picked $fname \($REPLY\) ; break ; done
51) file1
62) file2
73) file3
8select item: 2
9you picked file2 (2)
case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
case コマンドは最初にwordを展開し、パス名の展開と同じ一致ルールを使用して、各 pattern と順番に一致させようとします (PATHNAME EXPANSIONを参照)。 pattern は、以下のパターンマッチングで説明されているルールに従います。 wordは、チルダ展開、パラメータと変数の展開、算術置換、コマンド置換、プロセス置換、および引用符の削除を使用して展開されます。 検査された各 pattern は、チルダ展開、パラメータと変数の展開、算術置換、コマンド置換、およびプロセス置換を使用して展開されます。 シェル オプション nocasematch が有効な場合、一致はアルファベットの大文字と小文字に関係なく実行されます。 一致が見つかると、対応するlistが実行されます。 最初の一致の後、後続の一致は試行されません。 pattern が一致しない場合、終了ステータスはゼロです。 それ以外の場合は、 list で実行された最後のコマンドの終了ステータスです。
 1# * や ? はワイルドカード。 pattern は正規表現ではないことに注意。
 2num="[0-9]"
 3case "$1" in
 4  a* ) echo "aで始まる文字列" ;;
 5  ?b* ) echo "2文字目がbの文字列" ;;
 6  $num* ) echo "数字から始まる文字列" ;;
 7  [nN]o | "NO" ) echo "no,No,NOのいずれかの文字列" ;;
 8  ??[![:upper:]]* ) echo "3文字目が英大文字でない文字列" ;;
 9  * ) echo "上記のいずれでもない文字列" ;;
10esac
if list; then list; [ elif list; then list; ] ... [ else list; ] fi
if listが実行されます。終了ステータスがゼロの場合、then listが実行されます。 それ以外の場合、各 elif listが順番に実行され、その終了ステータスがゼロの場合、対応する then listが実行され、コマンドが完了します。それ以外の場合は、else list があればそれが実行されます。 終了ステータスは、最後に実行されたコマンドの終了ステータスです。条件が真ではない場合はゼロです。
while list; do list; done
until list; do list; done
while コマンドは、while list内の最後のコマンドが終了ステータス 0 を返す限り、do list を継続的に実行します。 until コマンドは、テストが否定されることを除いて、while コマンドと同じです(つまり until list の最後のコマンドが終了ステータス 0 以外を返す限り、do list を断続的に実行します)。 do listは、list内の最後のコマンドがゼロ以外の終了ステータスを返す限り実行されます。 while コマンドと until コマンドの終了ステータスは、最後に実行された do list コマンドの終了ステータス、または何も実行されなかった場合はゼロです。

以下は 1 から 10 までの数字が出力される例です。

1i=1
2until [ $i -gt 10 ]  # while [ ! $i -gt 10 ] と同じ
3do
4    echo $i
5    ((i++))
6done

シェル関数の定義

シェル関数は、単純なコマンドのように呼び出され、新しい一連の位置パラメータを使用して複合コマンドを実行するオブジェクトです。シェル関数は次のように宣言されます。

[ function ] name () compound-command [redirection]

これは name という名前の関数を定義します。予約語 function はオプションです。 予約語 function が指定されている場合、括弧はオプションです。 関数の本体は、複合コマンド compound-commandです (Compound Commandsを参照)。 そのコマンドは通常、{ と } の間のコマンドのリストですが、上記のCompound Commandsにリストされている任意のコマンドである場合があります。 単純なコマンドの名前として name が指定されるたびに、compound-command が実行されます。関数の定義時に指定されたリダイレクト (REDIRECTIONを参照) は、関数の実行時に実行されます。 関数定義の終了ステータスは、構文エラーが発生したり、同じ名前の読み取り専用関数が既に存在したりしない限り、0 です。 実行時の関数の終了ステータスは、本体で実行された最後のコマンドの終了ステータスです。 (FUNCTIONSを参照。)

コメント

非対話型シェル、または組み込みの shopt に対する interactive_comments オプションが有効になっている対話型シェル (BUILTIN COMMANDSを参照) では、# で始まる単語により、その単語とその行の残りのすべての文字が無視されます。 interactive_comments オプションが有効になっていない対話型シェルでは、コメントは許可されません。 interactive_comments オプションは、対話型シェルではデフォルトでオンになっています。

引用符 (QUOTING)

引用符は、特定の文字または単語の特別な意味をシェルから取り除くために使用されます。 引用符を使用して、特殊文字の特別な処理を無効にしたり、予約語がそのように認識されないようにしたり、パラメータの展開を防止したりできます。

上記の DEFINITIONS の下にリストされている各メタ文字は、シェルにとって特別な意味を持ち、それ自体を表す場合は引用符で囲む必要があります。

コマンド履歴展開機能 (HISTORY EXPANSIONを参照) が使用されている場合、履歴展開文字 (通常は !) を引用して、履歴展開を防止する必要があります。

引用符には、エスケープ文字、シングルクォート、およびダブルクォートの3つのメカニズムがあります。

引用符で囲まれていないバックスラッシュ \ はエスケープ文字です。 <newline> を除いて、次の文字のリテラル値を保持します。 \<newline> ペアが表示され、バックスラッシュ自体が引用符で囲まれていない場合、\<newline> は行の継続として扱われます (つまり、入力ストリームから削除され、事実上無視されます)。

文字を シングルクォート ' で囲むと、引用符内の各文字のリテラル値が保持されます。 バックスラッシュが前にある場合でも、シングルクォートの間にシングルクォートが出現しない場合があります。

文字をダブルクォートで囲むと、引用符内のすべての文字のリテラル値が保持されますが、$ ` \ および履歴展開が有効な場合は ! は例外です。 文字 $ および ` は、ダブルクォート内でその特別な意味を保持します。 バックスラッシュは、$ ` " \ または <newline> のいずれかの文字が続く場合にのみ、その特別な意味を保持します。 ダブルクォートで囲まれた ! がバックスラッシュを使用してエスケープされない限り、! の前のバックスラッシュは削除されません。

特殊パラメータ * と @ は、ダブルクォートで囲むと特別な意味を持ちます (Special Parameters を参照)。

$'string' 形式の単語は特別に扱われます。 単語は文字列に展開され、バックスラッシュでエスケープされた文字は ANSI C 標準の指定に従って置き換えられます。

1$ echo $'aaa\nbbb'
2aaa
3bbb

バックスラッシュのエスケープ シーケンスが存在する場合は次のようにデコードされます:

\a
アラート (ベル)
\b
バックスペース
\e
エスケープ文字
\f
フォーム フィード
\n
new line
\r
キャリッジリターン
\t
水平タブ
\v
垂直タブ
\\
バックスラッシュ
\’
シングルクォート
\nnn
8進数値 nnn (1 ~ 3桁) である 8 ビット文字
\xHH
16 進値 HH (1 桁または 2 桁の 16 進数) である 8 ビット文字
\cx
control-x 文字

展開された結果は、ドル記号がなかったかのようにシングルクォートで囲まれます。

ダブルクォートで囲まれた文字列の前にドル記号 $ を付けると、現在のロケールに従って文字列が翻訳されます。現在のロケールが C または POSIX の場合、ドル記号は無視されます。 文字列が翻訳されて置換される場合、置換はダブルクォートで囲まれます。

パラメータ (PARAMETERS)

パラメータは、値を格納するエンティティです。 これは、名前、数字、または以下の特殊パラメータにリストされている特殊文字のいずれかです。 変数は、nameで示されるパラメータです。 変数には、値と 0 個以上の属性があります。 属性は、declare 組み込みコマンドを使用して割り当てられます (組み込みコマンド declare を参照)。

値が割り当てられている場合、パラメータが設定されます。 null 文字列は有効な値です。 変数が設定されると、unset 組み込みコマンドを使用することによってのみ設定を解除できます (BUILTIN COMMANDSを参照)。

変数は、次の形式のステートメントによって代入できます。

name=[value]

value が指定されていない場合、変数にはヌル文字列が割り当てられます。すべての値は、チルダ展開、パラメータと変数の展開、コマンド置換、算術展開、および引用符の削除を受けます (EXPANSIONを参照)。 変数に整数属性が設定されている場合、 $((...)) 展開が使用されていなくても、value は算術式として評価されます (ARITHMETIC EXPANSIONを参照)。 以下の特別なパラメータで説明するように、"$@" を除いて、単語の分割は実行されません。 パス名展開は行いません。 割り当てステートメントは、alias、declare、typeset、export、readonly、および local 組み込みコマンドへの引数として表示されることもあります。

割り当てステートメントがシェル変数または配列インデックスに値を割り当てるコンテキストでは、+= 演算子を使用して、変数の前の値に追加または追加できます。 整数属性が設定されている変数に += を適用すると、value が算術式として評価され、変数の現在の値に加算されて評価されます。+= が複合代入を使用して配列変数に適用された場合 (ARRAYSを参照)、変数の値は (= を使用したときのように) 設定解除されず、配列の最大インデックスより 1 大きいインデックスから始まる新しい値が配列に追加されます。 . 文字列値の変数に適用すると、値が展開され、変数の値に追加されます。

位置パラメータ (Positional Parameters)

位置パラメータは、1 桁の 0 以外の 1 つ以上の数字で表されるパラメータです。位置パラメータは、シェルの呼び出し時にシェルの引数から割り当てられ、set 組み込みコマンドを使用して再割り当てできます。 位置パラメータは、代入ステートメントで代入することはできません。 位置パラメータは、シェル関数が実行されると一時的に置き換えられます (FUNCTIONSを参照)。

1 桁より大きい位置パラメータを展開する場合は、{} で囲む必要があります (EXPANSIONを参照)。

特殊パラメータ (Special Parameters)

シェルはいくつかのパラメータを特別に扱います。 これらのパラメータは参照のみ可能です。 それらへの割り当ては許可されていません。

*
1 から始まる位置パラメータに展開されます。展開がダブルクォート内で発生すると、各パラメータの値が IFS 特殊変数の最初の文字で区切られた単一の単語に展開されます。 つまり、$* は $1c$2c… と同等です。ここで、c は IFS 変数の値の最初の文字です。 IFS が設定されていない場合、パラメータはスペースで区切られます。 IFS が null の場合、パラメータはセパレータを介さずに結合されます。
1$ cat test1.sh
2#!/bin/bash
3for arg in "$*"; do echo "$arg"; done  # 単一の単語に展開されるためループ回数は1回
4$ ./test1.sh arg1 arg2
5arg1 arg2

@
1 から始まる位置パラメータに展開されます。 展開がダブルクォート内で発生すると、各パラメータは個別の単語に展開されます。 つまり、$@ は $1 $2 … と同等です。単語内でダブルクォートで囲まれた展開が発生した場合、最初のパラメータの展開は元の単語の先頭部分と結合され、展開 最後のパラメータの一部が元の単語の最後の部分と結合されます。 位置パラメータがない場合、"$@" と $@ は何も展開されません (つまり、それらは削除されます)。
1$ cat test2.sh
2#!/bin/bash
3for arg in "$@"; do echo "$arg"; done  # 個別の単語に展開されるためループ回数は2回
4$ ./test2.sh arg1 arg2
5arg1
6arg2

#
10 進数の位置パラメータの数に展開されます。
?
最後に実行されたフォアグラウンド パイプラインのステータスに展開します。
-
呼び出し時に set 組み込みコマンドによって指定された現在のオプション フラグ、またはシェル自体によって設定されたオプション フラグ (-i オプションなど) に展開します。
$
シェルのプロセスID に展開されます。 () サブシェルでは、サブシェルではなく、現在のシェルのプロセスID に展開されます。
!
最後に実行されたバックグラウンド (非同期) コマンドのプロセスID に展開されます。
0
シェルまたはシェル スクリプトの名前に展開されます。これは、シェルの初期化時に設定されます。コマンドのファイルを指定して bash を呼び出すと、$0 がそのファイルの名前に設定されます。 -c オプションを指定して bash を開始すると、実行する文字列の後の最初の引数 (存在する場合) に $0 が設定されます。 それ以外の場合は、引数ゼロで指定された、bash の呼び出しに使用されるファイル名に設定されます。
_
シェルの起動時に、環境または引数リストで渡された、実行中のシェルまたはシェル スクリプトを呼び出すために使用される絶対パス名に設定されます。続いて、展開後、前のコマンドの最後の引数に展開します。 また、実行され、そのコマンドにエクスポートされた環境に配置された各コマンドを呼び出すために使用されるフルパス名に設定されます。 メールをチェックするとき、このパラメータは現在チェックされているメールファイルの名前を保持します。

シェル変数 (Shell Variables)

次の変数は、シェルによって設定されます。

BASH
bash のこのインスタンスを呼び出すために使用される完全なファイル名に展開されます。
1$ echo $BASH
2/bin/bash
BASH_ARGC
値が現在の bash 実行コール スタックの各フレーム内のパラメータの数である配列変数。現在のサブルーチン (. または source で実行されるシェル関数またはスクリプト) へのパラメータの数は、スタックの一番上にあります。 サブルーチンが実行されると、渡されたパラメータの数が BASH_ARGC にプッシュされます。シェルは、拡張デバッグ モードの場合にのみ BASH_ARGC を設定します (組み込みコマンド shopt の extdebug オプションの説明を参照)。
 1$ bash -v sample.sh a b
 2#!/bin/bash
 3func(){
 4  echo "[ ${BASH_ARGC[@]} ]"
 5  echo "[ ${BASH_ARGV[@]} ]"
 6}
 7func x y z
 8[ 2 ]
 9[ b a ]
10
11shopt -s extdebug  # 拡張デバッグモード有効
12func x y z
13[ 3 2 ]
14[ z y x b a ]
BASH_ARGV
現在の bash 実行コール スタック内のすべてのパラメータを含む配列変数。最後のサブルーチン呼び出しの最後のパラメータは、スタックの一番上にあります。最初の呼び出しの最初のパラメータは一番下にあります。サブルーチンが実行されると、指定されたパラメータが BASH_ARGV にプッシュされます。 シェルは、拡張デバッグ モードの場合にのみ BASH_ARGV を設定します (組み込みコマンド shopt の extdebug オプションの説明を参照)。
BASH_COMMAND
現在実行しているか実行しようとしているコマンドです。 ただし、トラップによってシェルが実行しているコマンドは別で、 その場合は、トラップの発動時に実行していたコマンドになります。( trap の使用例を参照)
BASH_EXECUTION_STRING
-c 呼び出しオプションのコマンド引数。
BASH_LINENO
ソースファイル中の行番号からなる配列変数で、 それぞれの要素は FUNCNAME の各要素が呼び出された位置に対応します。 つまり、${BASH_LINENO[$i]} はソースファイル (${BASH_SOURCE[$i+1]}) 中で${FUNCNAME[$i]} が呼び出された行番号です。 別のシェル関数から参照されると ${BASH_LINENO[$i-1]} になります。 現在の行番号は LINENO で取得できます。( trap の使用例を参照)
BASH_REMATCH
=~ 二項演算子によってメンバーが [[ 条件コマンドに割り当てられる配列変数。 インデックス 0 の要素は、正規表現全体に一致する文字列の部分です。 インデックス n の要素は、n 番目の括弧で囲まれた部分式に一致する文字列の部分です。 この変数は読み取り専用です。 ( [[ 条件の使用例を参照)
BASH_SOURCE
ソースファイル名からなる配列変数で、それぞれの要素は配列変数 FUNCNAME の要素のシェル関数がそれぞれ定義されたファイル名に対応します。 シェル関数 ${FUNCNAME[$i]} はファイル ${BASH_SOURCE[$i]} で定義され、 ${BASH_SOURCE[$i+1]} から呼ばれています。
 1$ cat sample1.sh
 2#!/bin/bash
 3. ./sample2.sh
 4echo ${BASH_SOURCE[@]}
 5$ cat sample2.sh
 6#!/bin/bash
 7echo ${BASH_SOURCE[@]}
 8$ ./sample1.sh
 9./sample2.sh ./sample1.sh
10./sample1.sh
BASH_SUBSHELL
サブシェルまたはサブシェル環境が生成されるたびに 1 ずつ増加します。 初期値は 0 です。

以下は、BASH_SUBSHELL を使用したサンプルプログラムです。

 1#!/bin/bash
 2
 3# サブシェル内で変数を操作
 4(
 5    echo "Inside subshell (level $BASH_SUBSHELL)"
 6    my_var="Hello from subshell"
 7    echo "my_var inside subshell: $my_var"
 8)
 9
10# サブシェル外で変数を表示
11echo "Outside subshell (level $BASH_SUBSHELL)"
12echo "my_var outside subshell: $my_var"

このプログラムを実行すると、以下のような出力が得られます:

1Inside subshell (level 1)
2my_var inside subshell: Hello from subshell
3Outside subshell (level 0)
4my_var outside subshell:
BASH_VERSINFO
メンバが bash のこのインスタンスのバージョン情報を保持する読み取り専用の配列変数。 配列メンバーに割り当てられる値は次のとおりです。
BASH_VERSINFO[0]
メジャー バージョン番号 (リリース)。
BASH_VERSINFO[1]
マイナー バージョン番号 (バージョン)。
BASH_VERSINFO[2]
パッチ レベル。
BASH_VERSINFO[3]
ビルド バージョン。
BASH_VERSINFO[4]
リリース ステータス (例: beta1)。
BASH_VERSINFO[5]
MACHTYPE の値。
BASH_VERSION
bash のこのインスタンスのバージョンを説明する文字列に展開されます。
COMP_CWORD
現在のカーソル位置を含む単語の ${COMP_WORDS} へのインデックス。 この変数は、プログラム可能な補完機能によって呼び出されるシェル関数でのみ使用できます (以下の「プログラム可能な補完」を参照)。
COMP_LINE
現在のコマンド ライン。この変数は、プログラム可能な補完機能によって呼び出されるシェル関数および外部コマンドでのみ使用できます (以下の「プログラム可能な補完」を参照)。
COMP_POINT
現在のコマンドの先頭を基準とした現在のカーソル位置のインデックス。 現在のカーソル位置が現在のコマンドの末尾にある場合、この変数の値は ${#COMP_LINE} と等しくなります。 この変数は、プログラム可能な補完機能によって呼び出されるシェル関数および外部コマンドでのみ使用できます (以下の「プログラム可能な補完」を参照)。
COMP_WORDBREAKS
単語補完を実行するときに、Readline ライブラリが単語の区切り文字として扱う文字のセット。 COMP_WORDBREAKS が設定されていない場合、後でリセットされても、特別なプロパティは失われます。
COMP_WORDS
現在のコマンド ラインの個々の単語で構成される配列変数 (ARRAYSを参照)。 シェルパーサーが単語を分離するため、単語はシェルのメタ文字で分割されます。 この変数は、プログラム可能な補完機能によって呼び出されるシェル関数でのみ使用できます (以下の「プログラム可能な補完」を参照)。
DIRSTACK
ディレクトリスタックの現在の内容を含む配列変数 (ARRAYSを参照)。 ディレクトリは、組み込みの dirs によって表示される順序でスタックに表示されます。 この配列変数のメンバーへの割り当ては、スタック内に既にあるディレクトリを変更するために使用できますが、ディレクトリを追加および削除するには、pushd および組み込みコマンド popd を使用する必要があります。 この変数への割り当ては、現在のディレクトリを変更しません。 DIRSTACK が設定されていない場合、後でリセットされても、特別なプロパティは失われます。
EUID
シェルの起動時に初期化される、現在のユーザーの実効ユーザー ID に展開されます。 この変数は読み取り専用です。
FUNCNAME
現在実行コール スタックにあるすべてのシェル関数の名前を含む配列変数。 インデックス 0 の要素は、現在実行中のシェル関数の名前です。 一番下の要素は "main" です。 この変数は、シェル関数が実行されている場合にのみ存在します。 `FUNCNAME` への割り当ては効果がなく、エラー ステータスが返されます。 `FUNCNAME` が設定されていない場合、あとでリセットされてもその特別なプロパティは失われます。
 1$ cat sample.sh
 2#!/bin/bash
 3
 4func1 () { echo "[${FUNCNAME[@]}] in func1"; func2; }
 5func2 () { echo "[${FUNCNAME[@]}] in func2"; func3; }
 6func3 () { echo "[${FUNCNAME[@]}] in func3"; }
 7
 8# main
 9echo "[${FUNCNAME[@]}] in main"
10func1
11
12$ ./sample.sh
13[] in main
14[func1 main] in func1
15[func2 func1 main] in func2
16[func3 func2 func1 main] in func3
GROUPS
現在のユーザーがメンバーであるグループのリストを含む配列変数。 GROUPS への割り当ては効果がなく、エラー ステータスが返されます。 GROUPS が設定されていない場合、後でリセットされても、その特別なプロパティは失われます。
HISTCMD
現在のコマンドの履歴番号、または履歴リスト内のインデックス。 HISTCMD が設定されていない場合、後でリセットされても、その特別なプロパティは失われます。
HOSTNAME
現在のホストの名前に自動的に設定されます。
HOSTTYPE
bash が実行されているマシンのタイプを一意に説明する文字列に自動的に設定されます。 デフォルトはシステムに依存します。
LINENO
このパラメータが参照されるたびに、シェルは、スクリプトまたは関数内の現在の連続行番号 (1 から始まる) を表す 10 進数に置き換えます。 スクリプトまたは関数でない場合、置換された値が意味のあるものであるとは限りません。 LINENO が設定されていない場合、後でリセットされても、その特別なプロパティは失われます。
MACHTYPE
標準の GNU cpu-company-system 形式で、bash が実行されているシステム タイプを完全に説明する文字列に自動的に設定されます。 デフォルトはシステムに依存します。
OLDPWD
cd コマンドによって設定された以前の作業ディレクトリ。
OPTARG
getopts 組み込みコマンドによって処理された最後のオプション引数の値 (BUITIN COMMANDSを参照)。
OPTIND
getopts 組み込みコマンドによって処理される次の引数のインデックス (BUITIN COMMANDSを参照)。
OSTYPE
bash が実行されているオペレーティング システムを説明する文字列に自動的に設定されます。 デフォルトはシステムに依存します。
PIPESTATUS
最近実行されたフォアグラウンド パイプライン (1 つのコマンドのみを含む場合がある) 内のプロセスからの終了ステータス値のリストを含む配列変数 (ARRAYSを参照)。
1$ grep "" /dummy |  sed 's/aaa/bbb/g'
2grep: /euc: No such file or directory
3$ echo ${PIPESTATUS[@]}
42 0
PPID
シェルの親のプロセスID。 この変数は読み取り専用です。
PWD
cd コマンドによって設定された現在の作業ディレクトリ。
RANDOM
このパラメータが参照されるたびに、0 から 32767 までのランダムな整数が生成されます。 乱数のシーケンスは、値を RANDOM に割り当てることによって初期化できます。 RANDOM が設定されていない場合、後でリセットされても、その特別なプロパティは失われます。
REPLY
引数が指定されていない場合、read 組み込みコマンドによって読み取られた入力行に設定されます。
SECONDS
このパラメータが参照されるたびに、シェル呼び出しからの秒数が返されます。 値が SECONDS に割り当てられている場合、後続の参照で返される値は、割り当てからの秒数に割り当てられた値を加えたものになります。 SECONDS が設定されていない場合、後でリセットされても、その特別なプロパティは失われます。

以下の例では、何か時間のかかる処理の実行時間を計測することができます。

1#!/bin/bash
2
3echo "スクリプト開始"
4SECONDS=0
5
6# 何か時間のかかる処理
7
8duration=$SECONDS
9echo "$(($duration / 60))$(($duration % 60))秒経過"
SHELLOPTS
有効なシェル オプションのコロン区切りのリスト。 リスト内の各単語は、組み込みコマンド set の -o オプションの有効な引数です (BUITIN COMMANDSを参照)。 SHELLOPTS に現れるオプションは、set -o によって on として報告されるものです。 この変数が bash の起動時に環境内にある場合、起動ファイルを読み取る前に、リスト内の各シェル オプションが有効になります。 この変数は読み取り専用です。
SHLVL
bash のインスタンスが開始されるたびに 1 ずつ増加します。

以下の例では、いろいろな条件でシェルレベルを表示しています。

[sample1.sh]

1#!/bin/bash
2echo "[sample1.sh] 現在のシェルレベル: $SHLVL"
3# 新しいシェルを起動
4bash -c 'echo "[sample1.sh] 新しいシェルレベル: $SHLVL"'
5# サブシェル
6(echo "[sample1.sh] サブシェルの場合 : $SHLVL")
7# 別のシェルスクリプトを実行
8./sample2.sh

[sample2.sh]

1#!/bin/bash
2echo "[sample2.sh] 現在のシェルレベル: $SHLVL"
3# 別のシェルスクリプトを実行
4./sample3.sh

[sample3.sh]

1#!/bin/bash
2echo "[sample3.sh] 現在のシェルレベル: $SHLVL"

sample1.shの実行結果

1$ ./sample1.sh
2[sample1.sh] 現在のシェルレベル: 2
3[sample1.sh] 新しいシェルレベル: 3
4[sample1.sh] サブシェルの場合 : 2
5[sample2.sh] 現在のシェルレベル: 3
6[sample3.sh] 現在のシェルレベル: 4
UID
シェルの起動時に初期化される、現在のユーザーのユーザー ID に展開されます。 この変数は読み取り専用です。

次の変数は、シェルによって使用されます。 場合によっては、bash がデフォルト値を変数に割り当てます。 これらのケースを以下に示します。

BASH_ENV
bash がシェル スクリプトを実行しているときにこのパラメータが設定されている場合、その値は ~/.bashrc のように、シェルを初期化するコマンドを含むファイル名として解釈されます。 BASH_ENV の値は、パラメータ展開、コマンド置換、および算術展開を行ってからファイル名として解釈されます。 結果のファイル名の検索に PATH は使用されません。
CDPATH
cd コマンドの検索パス。 これは、シェルが cd コマンドで指定された宛先ディレクトリーを探すための、コロンで区切られたディレクトリーのリストです。 サンプル値は「.:~:/usr」です。
COLUMNS
選択リストを印刷するときの端末の幅を決定するために、select 組み込みコマンドによって使用されます。 SIGWINCH を受信すると自動的に設定されます。
COMPREPLY
プログラム可能な補完機能によって呼び出されたシェル関数によって生成された可能な補完を bash が読み取る配列変数 (以下の「プログラム可能な補完」を参照)。
EMACS
シェルが値「t」で開始するときに、bash が環境内でこの変数を検出すると、シェルが emacs シェル バッファーで実行されていると想定し、行編集を無効にします。
FCEDIT
fc 組み込みコマンドのデフォルトのエディター。
FIGNORE
ファイル名の補完を実行するときに無視するサフィックスのコロンで区切られたリスト (以下の READLINE を参照)。 接尾辞が FIGNORE のエントリの 1 つと一致するファイル名は、一致するファイル名のリストから除外されます。 サンプル値は「.o:~」です。
GLOBIGNORE
パス名展開によって無視される一連のファイル名を定義する、コロンで区切られたパターンのリスト。 パス名展開パターンに一致するファイル名が GLOBIGNORE のいずれかのパターンにも一致する場合、そのファイルは一致リストから削除されます。
HISTCONTROL
コマンドが履歴リストに保存される方法を制御する、コロンで区切られた値のリスト。 値のリストに ignorespace が含まれている場合、スペース文字で始まる行は履歴リストに保存されません。 値が ignoredups の場合、以前の履歴エントリに一致する行は保存されません。 ignoreboth の値は、ignorespace および ignoredups の省略形です。 値を erasedups にすると、現在の行に一致する以前のすべての行が、その行が保存される前に履歴リストから削除されます。 上記のリストにない値は無視されます。 HISTCONTROL が設定されていないか、有効な値が含まれていない場合、シェル パーサーによって読み取られたすべての行は、HISTIGNORE の値に従って履歴リストに保存されます。 複数行の複合コマンドの 2 行目以降はテストされず、HISTCONTROL の値に関係なく履歴に追加されます。
HISTFILE
コマンド履歴が保存されるファイルの名前 (HISTORY を参照)。 デフォルト値は ~/.bash_history です。 設定されていない場合、対話型シェルの終了時にコマンド履歴は保存されません。
HISTFILESIZE
履歴ファイルに含まれる最大行数。 この変数に値が割り当てられると、必要に応じて履歴ファイルが切り捨てられ、最も古いエントリが削除され、その行数を超えないようになります。 デフォルト値は 500 です。履歴ファイルも、対話型シェルの終了時に書き込み後にこのサイズに切り詰められます。
HISTIGNORE
どのコマンド ラインを履歴リストに保存するかを決定するために使用される、コロンで区切られたパターンのリスト。 各パターンは行の先頭に固定され、行全体と一致する必要があります (暗黙の ‘*’ は追加されません)。 HISTCONTROL で指定されたチェックが適用された後、各パターンが行に対してテストされます。 通常のシェル パターンマッチング文字に加えて、’&’ は前の履歴行にマッチします。 ‘&’ は、バックスラッシュを使用してエスケープできます。 一致を試みる前にバックスラッシュが削除されます。 複数行の複合コマンドの 2 行目以降はテストされず、HISTIGNORE の値に関係なく履歴に追加されます。
HISTSIZE
コマンド履歴に記憶するコマンドの数 (HISTORYを参照)。 デフォルト値は 500 です。
HISTTIMEFORMAT
この変数が設定されていて null でない場合、その値は strftime(3) のフォーマット文字列として使用され、組み込みコマンド history によって表示される各履歴エントリに関連付けられたタイムスタンプが出力されます。 この変数が設定されている場合、タイム スタンプが履歴ファイルに書き込まれるため、シェル セッション間でタイム スタンプが保持されます。
HOME
現在のユーザーのホーム ディレクトリ。 cd 組み込みコマンドのデフォルトの引数。 この変数の値は、チルダ展開の実行時にも使用されます。
HOSTFILE
シェルがホスト名を完成させる必要があるときに読み取る必要がある /etc/hosts と同じ形式のファイルの名前が含まれます。 可能なホスト名補完のリストは、シェルの実行中に変更される場合があります。 値が変更された後に次にホスト名の補完が試行されると、bash は新しいファイルの内容を既存のリストに追加します。 HOSTFILE が設定されていても値がない場合、bash は /etc/hosts を読み取って、可能なホスト名補完のリストを取得しようとします。 HOSTFILE が設定解除されると、ホスト名リストがクリアされます。
IFS
展開後の単語分割、および read 組み込みコマンドで行を単語に分割するために使用される内部フィールド セパレータ。 デフォルト値は「<スペース><タブ><改行>」です。
IGNOREEOF
唯一の入力として EOF 文字を受け取ったときの対話型シェルのアクションを制御します。 設定されている場合、値は bash が終了する前に入力行の最初の文字として入力する必要がある連続する EOF 文字の数です。 変数が存在するが数値がない場合、または値がない場合、デフォルト値は 10 です。変数が存在しない場合、EOF はシェルへの入力の終わりを示します。

以下のサンプルスクリプトを実行すると、新しいシェルが起動します。 このシェルでは、Ctrl-D を押してもすぐには終了せず、 5 回押すと終了します。 これは、 IGNOREEOF がシェルの終了を制御するためです。 この値を変更すると、シェルを終了するために必要な Ctrl-D の回数が変わります。 この機能は、誤ってシェルを終了するのを防ぐために役立ちます。 ただし、この設定は現在のシェルセッションにのみ適用され、新しいシェルセッションを開始するとリセットされます。 永続的に設定するには、設定を .bashrc や .bash_profile などのシェルの起動スクリプトに追加します。

 1#!/bin/bash
 2
 3# IGNOREEOFを5に設定
 4export IGNOREEOF=5
 5
 6echo "このシェルはCtrl-Dを押してもすぐには終了しません。"
 7echo "Ctrl-Dを${IGNOREEOF}回押すと終了します。"
 8
 9# シェルを起動
10/bin/bash
INPUTRC
~/.inputrc のデフォルトを上書きする readline 起動ファイルのファイル名 (以下の READLINE を参照)。
LANG
LC_ で始まる変数で特に選択されていないカテゴリのロケール カテゴリを決定するために使用されます。
LC_ALL
この変数は、ロケール カテゴリを指定する LANG およびその他の LC_ 変数の値を上書きします。
LC_COLLATE
この変数は、パス名展開の結果をソートするときに使用される照合順序を決定し、パス名展開とパターンマッチング内の範囲式、等価クラス、および照合シーケンスの動作を決定します。
LC_CTYPE
この変数は、文字の解釈と、パス名展開およびパターンマッチング内の文字クラスの動作を決定します。
LC_MESSAGES
この変数は、$ で始まるダブルクォートで囲まれた文字列を翻訳するために使用されるロケールを決定します。
LC_NUMERIC
この変数は、数値の書式設定に使用されるロケール カテゴリを決定します。
LINES
選択リストを印刷するための列の長さを決定するために、select 組み込みコマンドによって使用されます。 SIGWINCH を受信すると自動的に設定されます。
MAIL
このパラメータがファイル名に設定され、MAILPATH 変数が設定されていない場合、bash は指定されたファイルにメールが到着したことをユーザーに通知します。
MAILCHECK
bash がメールをチェックする頻度 (秒単位) を指定します。 デフォルトは 60 秒です。 メールをチェックする時間になると、シェルは最初のプロンプトを表示する前にチェックを行います。 この変数が設定されていない場合、またはゼロ以上の数値ではない値に設定されている場合、シェルはメール チェックを無効にします。
MAILPATH
メールをチェックするファイル名のコロンで区切られたリスト。 メールが特定のファイルに届いたときに表示されるメッセージは、ファイル名とメッセージを ‘?’ で区切って指定することができます。 メッセージのテキストで使用すると、$_ は現在のメールファイルの名前に展開されます。例:
MAILPATH='/var/mail/bfox?"You have mail":~/shell-mail?"$_ has mail!"'
Bash はこの変数のデフォルト値を提供しますが、使用するユーザー メール ファイルの場所はシステムに依存します (例: /var/mail/$USER)。
OPTERR
値が 1 に設定されている場合、bash は getopts 組み込みコマンドによって生成されたエラー メッセージを表示します (BUILTIN COMMANDSを参照)。 OPTERR は、シェルが呼び出されるかシェル スクリプトが実行されるたびに 1 に初期化されます。
PATH
コマンドの検索パス。 これは、シェルがコマンドを検索するディレクトリのコロンで区切られたリストです (以下の「コマンド実行」を参照)。 PATH の値に含まれる長さゼロ (null) のディレクトリ名は、現在のディレクトリを示します。 null ディレクトリ名は、2 つの隣接するコロンとして、または先頭または末尾のコロンとして表示される場合があります。 デフォルトのパスはシステムに依存し、bash をインストールする管理者によって設定されます。 一般的な値は「/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin」です。
POSIXLY_CORRECT
この変数が bash の起動時に環境内にある場合、シェルは --posix 呼び出しオプションが指定されたかのように、起動ファイルを読み取る前に posix モードに入ります。 シェルの実行中に設定すると、コマンド set -o posix が実行されたかのように、bash は posix モードを有効にします。
PROMPT_COMMAND
設定されていると、プライマリプロンプトを出す前に毎回、 この値がコマンドとして実行されます。

ex. コマンド実行時にオリジナルのヒストリファイルを作成する。またcdなどでディレクトリ変更した場合は、自動で ls コマンドを実行する。 以下のコードを .bashrc などに記載する。

 1# オリジナルのヒストリファイルを作成
 2#   作成ファイル名 --> .bash_history_自身のプロセスID
 3#   1行の形式 --> 直前の実行コマンド : ステータス
 4# 直前の実行コマンドは history 1 で取得、ただし履歴番号は除去
 5command_and_status_history() {
 6    status=$?
 7    command="$(history 1 | gsed -E 's/^\s+\S+\s+//')"
 8    echo "$command : $status" >> ~/.bash_history_$$
 9}
10
11# ディレクトリを移動したら自動でls
12auto_ls() {
13  [[ -n $chkdir ]] && [[ $chkdir != $PWD ]] && ls
14  chkdir="$PWD"
15}
16
17# 複数コマンドを実行可能。左から順に実行される
18PROMPT_COMMAND="command_and_status_history; auto_ls; $PROMPT_COMMAND"

併せて、以下のコードを .bash_logout に書いておく。 これにより作成したヒストリファイルがログアウト時に削除される。

1rm .bash_history_$$
PS1
このパラメータの値は展開され (PROMPTINGを参照)、プライマリ プロンプト文字列として使用されます。 デフォルト値は「\s-\v\$」です。
PS2
このパラメータの値は、PS1 と同様に展開され、2 番目のプロンプト文字列として使用されます。 デフォルトは「>」です。
PS3
このパラメータの値は、選択コマンドのプロンプトとして使用されます (SHELL GRAMMARを参照)。
PS4
このパラメータの値は PS1 と同様に展開され、実行トレース中に各コマンド bash が表示される前に値が出力されます。 PS4 の最初の文字は、複数レベルの間接性を示すために、必要に応じて複数回複製されます。 デフォルトは「+」です。
 1$ cat -n sample1.sh
 2     1	#!/bin/bash
 3     2	. ./sample2.sh
 4     3	echo "In main"
 5     4	funcA
 6$
 7$ cat -n sample2.sh
 8     1	#!/bin/bash
 9     2	funcA() {
10     3	  echo "In funcA"
11     4	  funcB
12     5	}
13     6	funcB() {
14     7	  echo "In funcB"
15     8	}
16$
17$ export PS4='+ (${BASH_SOURCE##*/}:${LINENO}): ${FUNCNAME:+$FUNCNAME(): }'
18$
19$ bash -x /tmp/sample1.sh
20+ (sample1.sh:2): . ./sample2.sh
21+ (sample1.sh:3): echo 'In main'
22In main
23+ (sample1.sh:4): funcA
24+ (sample2.sh:3): funcA(): echo 'In funcA'
25In funcA
26+ (sample2.sh:4): funcA(): funcB
27+ (sample2.sh:7): funcB(): echo 'In funcB'
28In funcB
SHELL
シェルへのフル パス名は、この環境変数に保持されます。 シェルの開始時に設定されていない場合、bash は現在のユーザーのログイン シェルのフル パス名をシェルに割り当てます。
TIMEFORMAT
このパラメータの値は、time 予約語で始まるパイプラインのタイミング情報の表示方法を指定するフォーマット文字列として使用されます。 % 文字は、時間値またはその他の情報に展開されるエスケープ シーケンスを導入します。 エスケープ シーケンスとその意味は次のとおりです。 中括弧はオプションの部分を示します。
%%
リテラル %
%[p][l]R
秒単位の経過時間
%[p][l]U
ユーザーモードで費やされた CPU 秒数
%[p][l]S
システム モードで費やされた CPU 秒数
%P
(%U + %S) / %R として計算された CPU パーセンテージ

オプションの p は、小数点以下の桁数である精度を指定する数字です。 値が 0 の場合、小数点または小数は出力されません。 小数点以下 3 桁まで指定できます。 3 より大きい p の値は 3 に変更されます。p が指定されていない場合は、値 3 が使用されます。

オプションの l は、分を含む MMmSS.FFs 形式の長い形式を指定します。 p の値によって、分数が含まれるかどうかが決まります。

この変数が設定されていない場合、bash は値が $'\nreal\t%3lR\nuser\t%3lU\nsys%3lS' であるかのように動作します。 値が null の場合、タイミング情報は表示されません。 書式文字列が表示されると、末尾に改行が追加されます。
TMOUT
ゼロより大きい値を設定すると、TMOUT は組み込みコマンド read のデフォルトのタイムアウトとして扱われます。 端末からの入力時に TMOUT 秒経過しても入力が届かない場合、select コマンドは終了します。 対話型シェルでは、値は、プライマリ プロンプトを発行した後に入力を待機する秒数として解釈されます。 入力が到着しない場合、bash はその秒数待機した後に終了します。
TMPDIR
設定されている場合、Bash はその値を、Bash がシェルで使用する一時ファイルを作成するディレクトリの名前として使用します。
auto_resume
この変数は、シェルがユーザーおよびジョブ コントロールと対話する方法を制御します。 この変数が設定されている場合、リダイレクトのない単一の単語の単純なコマンドは、既存の停止されたジョブの再開の候補として扱われます。 あいまいさは許されません。 入力した文字列で始まるジョブが複数ある場合は、最後にアクセスしたジョブが選択されます。 このコンテキストでは、停止したジョブの名前nameは、それを開始するために使用されるコマンド ラインです。 値を正確に設定した場合、指定された文字列は停止したジョブの名前と正確に一致する必要があります。 substring に設定されている場合、指定された文字列は、停止したジョブの名前の部分文字列と一致する必要があります。 部分文字列値は、%? に似た機能を提供します。 ジョブ識別子 (JOB CONTROLを参照)。 他の値に設定されている場合、指定された文字列は停止したジョブの名前のプレフィックスである必要があります。 これは、%string ジョブ識別子に類似した機能を提供します。
histchars
履歴展開とトークン化を制御する 2 つか 3 つの文字 (HISTORY EXPANSIONを参照)。 最初の文字は履歴展開文字で、ヒストリ拡張の開始を知らせる文字で、通常は ‘!’ です。 2 番目の文字はクイック置換文字で、前に入力したコマンドを再実行するための短縮形として使用され、コマンド内の 1 つの文字列を別の文字列に置き換えます。 デフォルトは ‘^’ です。 オプションの 3 番目の文字は、単語の最初の文字 (通常は ‘#’) として見つかった場合に、行の残りがコメントであることを示す文字です。 履歴コメント文字により、行の残りの単語の履歴置換がスキップされます。 シェルパーサーが行の残りをコメントとして扱うとは限りません。

配列 (Arrays)

Bash は 1 次元配列変数を提供します。 任意の変数を配列として使用できます。組み込みコマンド declare は明示的に配列を宣言します。 配列のサイズに上限はありません。また、メンバーが連続してインデックス付けされたり、割り当てられたりする必要もありません。 配列は整数を使用してインデックス付けされ、ゼロから始まります。

構文 name[subscript]=value を使用して変数が割り当てられると、配列が自動的に作成されます。 subscriptは、ゼロ以上の数値に評価される算術式として扱われます。 配列を明示的に宣言するには、declare -a name を使用します (BUILTIN COMMANDSを参照)。 declare -a name[subscript] も受け入れられます。 subscript は無視されます。 属性は、declare および組み込みコマンド readonly を使用して配列変数に指定できます。 各属性は、配列のすべてのメンバーに適用されます。

配列は、name=(value1 ... valueN) の形式の複合割り当てを使用して割り当てられます。ここで、各 value は [subscript]=string の形式です。 string は必須です。 オプションの[subscript]が指定されている場合、そのインデックスが割り当てられます。 それ以外の場合、割り当てられた要素のインデックスは、ステートメントによって最後に割り当てられたインデックスに 1 を加えたものになります。 インデックスはゼロから始まります。 この構文は、組み込みコマンド declare でも受け入れられます。 上記で紹介した name[subscript]=value 構文を使用して、個々の配列要素を割り当てることができます。

 1$ a=(m n)
 2$ echo ${a[0]},${a[1]}}
 3m,n
 4$ b=([1]=x [2]=y)
 5$ b+=([4]=z)
 6$ echo ${b[0]},${b[1]},${b[2]},${b[3]},${b[4]}
 7,x,y,,z
 8$ b[2]=Y
 9$ echo ${b[@]}
10x Y z

${name[subscript]} を使用して、配列の任意の要素を参照できます。 パス名展開との競合を避けるためにブレース{}が必要です。 subscript が @ または * の場合、単語は name のすべてのメンバーに展開されます。 これらのsubscriptは、単語がダブルクォートで囲まれている場合にのみ異なります。 単語がダブルクォートで囲まれている場合、${name[*]} は各配列メンバーの値が IFS 特殊変数の最初の文字で区切られた単一の単語に展開され、${name[@]} は name の各要素を分離した単語に展開します。 配列メンバーがない場合、${name[@]} は何も展開されません。 ダブルクォートで囲まれた展開が単語内にある場合、最初のパラメータの展開は元の単語の先頭部分と結合され、最後のパラメータの展開は元の単語の最後の部分と結合されます。 これは、特殊パラメータ * および @ の展開に類似しています (Special Parametersを参照)。 ${#name[subscript]} は ${name[subscript]} の長さに展開されます。 添字が * または @ の場合、展開は配列内の要素の数です。 添え字なしで配列変数を参照することは、要素ゼロを参照することと同じです。

組み込みコマンド unset は、配列を破棄するために使用されます。 unset name[subscript] は、インデックス subscript の配列要素を破棄します。 ファイル名の生成によって引き起こされる望ましくない副作用を避けるように注意する必要があります。 unset name (name は配列)、または unset name[subscript] (subscript は * または @) は、配列全体を削除します。

組み込みコマンド declare, local, および readonly はそれぞれ、配列を指定する -a オプションを受け入れます。組み込みコマンド read は、標準入力から読み取った単語のリストを配列に割り当てる -a オプションを受け入れます。組み込みコマンド set および declare は、割り当てとして再利用できるように配列値を表示します。

以下の例では、ある値が配列に含まれているかをチェックしています。

1$ array=('apple' 'orange' 'banana' 'peach')
2$ grep -wq "banana" <<< "${array[@]}"  # -w : 単語としてマッチするかをテストする
3$ echo $?
40
5$ grep -wq "bana" <<< "${array[@]}"
6$ echo $?
71

展開 (EXPANSION)

展開は、単語に分割された後、コマンド ラインで実行されます。 実行される展開には、ブレース展開、チルダ展開、パラメータと変数の展開、コマンド置換、算術展開、単語分割、およびパス名展開の 7 種類があります。

展開の順序は、ブレース展開、チルダ展開、パラメータ、変数と算術展開、およびコマンド置換 (左から右に行われる)、単語分割、およびパス名展開です。

それをサポートできるシステムでは、利用可能な追加の拡張があります: プロセス置換です。

展開の単語数を変更できるのは、ブレース展開、単語分割、およびパス名展開のみです。 他の展開は、1 つの単語を 1 つの単語に展開します。 これに対する唯一の例外は、上で説明した "$@" と "${name[@]}" の展開です (PARAMETERSを参照)。

ブレース展開 (Brace Expansion)

ブレース展開は、任意の文字列を生成できるメカニズムです。 このメカニズムはパス名の展開に似ていますが、生成されるファイル名が存在する必要はありません。 ブレース展開されるパターンは、オプションのプリアンブルの形式を取り、その後に一連のカンマ区切りの文字列または 1 組の中括弧の間のシーケンス式が続き、その後にオプションのポストスクリプトが続きます。 プリアンブルは、中括弧内に含まれる各文字列の前に付けられ、ポストスクリプトは結果の各文字列に追加され、左から右に展開されます。

ブレース展開は入れ子にすることができます。 展開された各文字列の結果はソートされません。 左から右の順序が維持されます。 たとえば、a{d,c,b}e は「ade ace abe」に展開されます。

シーケンス式は {x..y} の形式を取ります。ここで、x と y は整数または単一の文字です。 整数が指定された場合、式は x と y の間の各数値に展開されます。 文字が指定されると、式は x と y の間の辞書式に各文字に展開されます。 x と y の両方が同じ型でなければならないことに注意してください。

1$ arr=({1..10})
2$ echo ${arr[@]}
31 2 3 4 5 6 7 8 9 10
4$ echo {s..z}
5s t u v w x y z

ブレース展開は他の展開よりも前に実行され、他の展開に特有の文字は結果に保持されます。 それは厳密にテキストです。 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 との厳密な互換性が必要な場合は、+B オプションを指定して bash を起動するか、set コマンドの +B オプションを指定してブレース展開を無効にします (BUILTIN COMMANDSを参照)。

 1$ echo a{d,c,b}e
 2ade ace abe
 3$ echo  a{7..5}b
 4a7b a6b a5b
 5$ echo  1{e..g}2
 61e2 1f2 1g2
 7$ echo a{\{z,y\,}b
 8a{zb ay,b
 9$ echo /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
10/usr/ucb/ex /usr/ucb/edit /usr/lib/ex?.?* /usr/lib/how_ex

チルダ展開 (Tilde Expansion)

単語が引用符で囲まれていないチルダ文字 ~ で始まる場合、最初の引用符で囲まれていないスラッシュの前にあるすべての文字 (または、引用符で囲まれていないスラッシュがない場合はすべての文字) がチルダ接頭辞と見なされます。 チルダ接頭辞の文字が引用符で囲まれていない場合、チルダに続くチルダ接頭辞の文字は、可能なログイン名として扱われます。 このログイン名が null 文字列の場合、チルダはシェルパラメータ HOME の値に置き換えられます。 HOME が設定されていない場合、シェルを実行しているユーザーのホームディレクトリが代わりに使用されます。 それ以外の場合、チルダ接頭辞は、指定されたログイン名に関連付けられたホームディレクトリに置き換えられます。

チルダ接頭辞が ~+ の場合、シェル変数 PWD の値がチルダ接頭辞を置き換えます。 チルダ接頭辞が ~- の場合、シェル変数 OLDPWD の値が設定されていれば、その値が代入されます。 チルダ接頭辞のチルダに続く文字が数字 N で構成され、オプションで + または - を前に付けた場合、チルド接頭辞はディレクトリスタックの対応する要素に置き換えられ、チルダ接頭辞を引数として呼び出された組み込みコマンド dirs によって表示されるようになります。 チルダ接頭辞のチルダに続く文字が、先頭に + または - を付けない数字で構成されている場合、+ が想定されます。

ログイン名が無効な場合、またはチルダの展開に失敗した場合、単語は変更されません。

各変数への代入では、: または最初の = の直後に引用符で囲まれていないチルダ接頭辞がないかチェックされます。 これらの場合、チルダ展開も実行されます。 したがって、 PATH 、MAILPATH および CDPATH への割り当てでチルダ付きのファイル名を使用することができ、シェルは展開された値を割り当てます。

1$ pwd
2/tmp
3$ path=~+/dir1             # 最初の = の直後のチルダ接頭辞は展開される
4$ path=$path:~+/dir2/dir3  # : の直後のチルダ接頭辞は展開される
5$ echo $path
6/tmp/dir1:/tmp/dir2/dir3

パラメータ展開 (Parameter Expansion)

$parameter の形式で、parameter の値で展開する。

$ 文字は、パラメータ展開、コマンド置換、または算術展開を導入します。 展開されるパラメータ名またはシンボルはブレース{}で囲むことができます。これはオプションですが、変数名の一部として解釈される可能性のある直後の文字から展開される変数を保護するのに役立ちます。

ブレースが使用される場合、対応する終了ブレースは、バックスラッシュまたは引用符で囲まれた文字列内でエスケープされていない最初の } であり、組み込みの算術展開、コマンド置換、またはパラメータ展開内ではありません。

${parameter}
parameterの値が代入されます。 parameter が2桁以上の位置パラメータである場合、またはparameterの後にparameter名の一部として解釈されない文字が続く場合、ブレースが必要です。

parameterの最初の文字が感嘆符!である場合、可変間接性のレベルが導入されます。 Bash は、parameterの残りの部分から形成された変数の値を変数のnameとして使用します。 この変数は展開され、その値はparameter自体の値ではなく、残りの置換で使用されます。 これは間接展開として知られています。 これに対する例外は、以下で説明する ${!prefix*} および ${!name[@]} の展開です。 間接展開を導入するために、感嘆符は左ブレースの直後に置く必要があります。

1$ A=z
2$ echo $AB  # ABが変数名と見做される
3
4$ echo ${A}B
5zB
6$ z=7
7$ echo ${!A}B  # Aの値zを新たなparameter名と見做す
87B
9$

以下の各ケースでは、word はチルダ展開、パラメータ展開、コマンド置換、および算術展開の対象となります。 部分文字列展開以外の場合、bash は parameter に対して unset または null であるかをテストします。 コロンを省略すると、parameter に対して unset であるかのみをテストします。

unset:変数が同プロセスでかつて一度も登場していない
null:変数は登場しているが値は未設定、または空文字が設定されている状態
ex1 ) VARIABLE=
ex2 ) VARIABLE=""

${parameter:-word}
デフォルト値を使用します。 parameterが unset か null の場合、word を展開したものに置換されます。 それ以外の場合は、parameter の値が代入されます。
 1$ echo ${A-z}  # Aはunsetのためデフォルト値で置換される
 2z
 3$ echo ${A:-z}  # Aはunsetのためデフォルト値で置換される
 4z
 5$ echo $A  # Aにデフォルト値は代入されていない
 6
 7$ A=""
 8$ echo ${A-z}  # Aはunsetではないのでデフォルト値で置換されない
 9
10$ echo ${A:=z}  # Aはunsetではないがnullのためデフォルト値で置換される
11z
12$ echo $A
13z
14$
${parameter:=word}
デフォルト値を代入します。 parameter が unset か null の場合、word の展開結果が parameter に代入されます。 その時、 parameter の値への置換が行われます。 位置パラメータと特殊パラメータは、この方法では代入できません。
 1$ echo ${A:=z}  # Aはunsetなのでデフォルト値が設定される
 2z
 3$ echo $A  # デフォルト値が設定されていることを確認
 4z
 5$ echo ${A:=y}  # Aはnullではないのでデフォルト値が設定されない
 6z
 7$ A=""
 8$ echo ${A=1}  # Aはunsetではないのでデフォルト値が設定されない
 9
10$ echo ${A:=1}  # Aはunsetではないがnullのためデフォルト値が設定される
111
12$ 
${parameter:?word}
null または unset の場合はエラーを表示します。 parameter が null または unset の場合、word の展開 (または word が存在しない場合はその旨のメッセージ) が標準エラー出力に出力され、対話型でない場合はシェルが終了します。 それ以外の場合は、parameterの値への置換が行われます。
1$ cat expansion.sh  # テスト用シェルスクリプトを表示
2#!/bin/bash
3echo ${A:?"A is unset"}
4echo "test"
5$ ./expansion.sh  # テスト用シェルスクリプトを実行
6./expansion.sh: line 2: A: A is unset
7$ echo $?  # 終了ステータスは異常値1が返却される
81
9$
${parameter:+word}
代替値を使用します。 parameter が null または unset の場合、何も置換されません。それ以外の場合は、wordの展開結果で置換されます。

 1$ echo ${A:+z}  # Aはunsetのため置換は実行されない
 2
 3$ A=7
 4$ echo $A
 57
 6$ echo ${A:+z}  # Aはnullでないため、デフォルト値で置換される
 7z
 8$ echo $A  # デフォルト値は代入されない
 97
10$
${parameter:offset}
${parameter:offset:length}
部分文字列展開。 parameter を開始位置 offset から指定された個数 length だけ展開します。 length を省略すると、parameter の末尾まで展開されます。 length と offset は算術式です (ARITHMETIC EVALUATION を参照)。 length はゼロ以上の数値に評価される必要があります。 offset がゼロ未満の数値に評価される場合、その値は parameter の値の末尾からの offset として使用されます。 parameter が @ の場合、結果は offset から始まる位置パラメータの length になります。 parameter が @ または * でインデックス付けされた配列名の場合、結果は ${parameter[offset]} で始まる配列のメンバーの length になります。 負の offset は、指定された配列の最大インデックスより 1 大きいインデックスに対して相対的に取得されます。 :- 展開と混同しないように、負の offset は少なくとも 1 つのスペースでコロンと区切る必要があることに注意してください。 部分文字列のインデックスは、位置パラメータが使用されない限りゼロから始まります。この場合、インデックスは 1 から始まります。
 1$ A=abcde
 2$ echo ${A:1:3}
 3bcd
 4$ echo ${A:1}
 5bcde
 6$ echo ${A: -3}
 7cde
 8$ echo ${A: -3:2}  # : と - の間に空白を入れること
 9cd
10$ cat expansion.sh
11#!/bin/bash
12echo ${@:3:2}
13$ ./expansion.sh a bc def ghij klmno
14def ghij
15$ arr[0]=a; arr[1]=bc; arr[2]=def; arr[3]=ghij; arr[4]=klmno
16$ echo ${arr[@]}
17a bc def ghij klmno
18$ echo ${arr[@]:3:2}  # インデックスが3以上で小さい方から2個のメンバー(arr[3]とarr[4])を出力
19ghij klmno
20$
${!prefix*}
${!prefix@}
前方一致する変数名。変数名が prefix で始まり、IFS 特殊変数の最初の文字で区切られた変数名に展開されます。
1$ echo ${!C@}
2COLUMNS COMP_WORDBREAKS CPPFLAGS
3$
${!name[@]}
${!name[*]}
配列のキーのリスト。name が配列変数の場合、name で割り当てられた配列インデックス (キー) のリストに展開されます。 name が配列でない場合、name が設定されていれば 0 に展開され、それ以外の場合は null に展開されます。 ダブルクォートの中で @ が使用された場合、各キーは個別の word に展開されます。
 1$ x=10; y=50; z=90; arr[0]=x; arr[1]=y; arr[2]=z
 2$ echo $x $y $z
 310 50 90
 4$ echo ${arr[@]}
 5x y z
 6$ for i in "${!arr[@]}"; do echo $i ${arr[$i]} ${!arr[$i]}; done
 70 x 10
 81 y 50
 92 z 90
10$

配列の要素存在チェックの例

1$ array=('apple' 'orange' 'banana' 'peach')
2$ grep -wq "banana" <<< "${array[@]}"  # -w : 単語としてマッチするかをテストする
3$ echo $?
40
5$ grep -wq "bana" <<< "${array[@]}"
6$ echo $?
71
${#parameter}
parameter の長さ。 parameter の値の文字数に置換されます。 parameterが * または @ の場合、置換される値は位置パラメータの数です。 parameterが * または @ で添字付けされた配列名である場合、置換される値は配列内の要素の数です。
 1$ A=abcde
 2$ echo ${#A}  # Aの文字数を返却
 35
 4$ cat expansion.sh  # テスト用シェルの内容確認
 5#!/bin/bash
 6echo ${#*}
 7$ ./expansion.sh x y  # 位置パラメータの数を返却
 82
 9$ arr=(7 9 5)  # 配列定義
10$ echo ${#arr[*]}  # 配列の要素数を返却
113
12$
${parameter#word}
${parameter##word}
パターンに前方一致した部分を取り除く。 word が展開され、パス名展開の場合と同じようなパターンを作ります。このパターンが parameter の値の先頭とマッチする場合、展開して得られる値は parameter を展開した値から最短一致パターン( # の場合) または最長一致パターン( ## の場合)が削除されたものになります。 parameter が @ または * の場合、パターン除去操作は各位置パラメータに順番に適用され、展開結果はリストとして得られます。 parameter が @ または * で添字付けされた配列変数である場合、パターン除去操作は配列の各メンバーに順番に適用され、展開結果はリストとして得られます。
 1$ A=abcabc
 2$ echo ${A#ab}
 3cabc
 4$ echo ${A#??}
 5cabc
 6$ echo ${A#*ab}
 7cabc
 8$ echo ${A##*ab}
 9c
10$ cat expansion.sh
11#!/bin/bash
12echo ${*#*ab}
13echo ${*##*ab}
14$ ./expansion.sh abc abcabc
15c cabc
16c c
17$ arr=(abc abcabc)
18$ echo ${arr[*]#*ab}
19c cabc
20$ echo ${arr[*]##*ab}
21c c
22$
${parameter%word}
${parameter%%word}
パターンに後方一致した部分を取り除く。 word が展開され、パス名展開の場合と同じようなパターンを作ります。このパターンが parameter の値の末尾部分にマッチする場合、展開して得られる値は parameter を展開した値から最短一致パターン( % の場合) または最長一致パターン( %% の場合) が削除されたものになります。 parameter が @ または * の場合、パターン除去操作は各位置パラメータに順番に適用され、展開結果はリストとして得られます。 parameter が @ または * で添字付けされた配列変数である場合、パターン除去操作は配列の各メンバーに順番に適用され、展開結果はリストとして得られます。
1$ A=abcabc
2$ echo ${A%b*}
3abca
4$ echo ${A%%b*}
5a
6$
${parameter/pattern/string}
パターンの置換。パス名の展開と同様に、pattern が展開されてパターンが生成されます。 parameter が展開され、その値に対する pattern の最長一致が string に置き換えられます。 Ipattern が / で始まる場合、pattern のすべての一致が string に置き換えられます。 通常、最初の一致のみが置き換えられます。 パターンが # で始まる場合、parameterの展開された値の先頭で一致する必要があります。 pattern が % で始まる場合、parameter の展開された値の最後で一致する必要があります。 string が null の場合、一致するパターンは削除され、/ に続くパターンは省略される場合があります。 parameter が @ または * の場合、置換操作は各位置パラメータに順番に適用され、展開は結果のリストになります。 parameter が @ または * で添字付けされた配列変数である場合、置換操作は配列の各メンバーに順番に適用され、展開は結果のリストになります。
 1$ A=abcabc
 2$ echo ${A/bc/BC}
 3aBCabc
 4$ echo ${A/*bc/BC}  # 最長一致で置換
 5BC
 6$ echo ${A//bc/BC}  # グローバル置換
 7aBCaBC
 8$ echo ${A/#a*a/7}  # 先頭一致
 97bc
10$ echo ${A/%b*c/7}  # 最後一致
11a7
12$ echo ${A/%b*c}  # 置換文字stringの省略
13a
14$

コマンド置換 (Command Substitution)

コマンド置換を使用すると、コマンドの出力をコマンド名に置き換えることができます。 次の 2 つの形式があります。

$(command)
  または
`command`

Bash は、コマンドを実行し、コマンド置換をコマンドの標準出力に置き換え、末尾の改行を削除して展開を実行します。 埋め込まれた改行は削除されませんが、単語分割中に削除される場合があります。 コマンド置換 $(cat file) は、同等で高速な $(< file) に置き換えることができます。

古いスタイルのバッククォート形式の置換が使用される場合、バックスラッシュは、$` または \ が続く場合を除いて、その文字どおりの意味を保持します。 バックスラッシュが前にない最初のバッククォートは、コマンド置換を終了します。 $(command) 形式を使用する場合、括弧内のすべての文字がコマンドを構成します。 特別に扱われることはありません。

コマンド置換は入れ子にすることができます。 バッククォートで囲まれた形式を使用するときにネストするには、内側のバッククォートをバックスラッシュでエスケープします。

置換がダブルクォートで囲まれている場合、単語の分割とパス名の展開は結果に対して実行されません。

算術展開 (Arithmetic Expansion)

算術展開により、算術式の評価と結果の置換が可能になります。 算術展開の形式は次のとおりです。

$((式))

式はダブルクォート内にあるかのように扱われますが、括弧内のダブルクォートは特別に扱われません。 式内のすべてのトークンに対して、パラメータ展開、文字列展開、コマンド置換、および引用符の削除が行われます。 算術展開は入れ子にすることができます。

評価は、ARITHMETIC EVALUATION に記載されている規則に従って実行されます。 式が無効な場合、bash は失敗を示すメッセージを出力し、置換は行われません。

プロセス置換 (Process Substitution)

プロセス置換を使えば、コマンド出力をファイルのように扱えます。

プロセス置換は、名前付きパイプ (FIFOs) または /dev/fd によるオープン ファイルの命名方法をサポートするシステムでサポートされています。 <(list) または >(list) の形式を取ります。 プロセス リストは、入力または出力が FIFO または /dev/fd 内のファイルに接続された状態で実行されます。 このファイルの名前は、展開の結果として現在のコマンドに引数として渡されます。 >(list) 形式を使用すると、ファイルへの書き込みによって list の入力が提供されます。 <(list) 形式を使用する場合は、引数として渡されたファイルを読み取って list の出力を取得する必要があります。

利用可能な場合、プロセス置換は、パラメータと変数の展開、コマンド置換、および算術展開と同時に実行されます。

例1. 入力ファイルとして使う例

1$ diff <(date) <(sleep 1;date)
21c1
3< 2023年 3月21日 火曜日 11時15分35秒 JST
4---
5> 2023年 3月21日 火曜日 11時15分36秒 JST

例2. while に渡す入力ファイルについて、パイプとプロセス置換で比較

 1$ bash -v sample.sh
 2#!/bin/bash
 3sum=0;
 4# パイプを使って計算
 5echo -e "1\n2\n3" | \
 6while read val; do ((sum+=val)); echo $sum; done
 71
 83
 96
10# パイプはサブシェル実行のため、親シェル側の sum に計算結果が反映されない
11echo $sum
120
13# プロセス置換を使って計算
14while read val; do ((sum+=val)); echo $sum; done < <(echo -e "1\n2\n3")
15echo -e "1\n2\n3"
161
173
186
19# sum に計算結果が反映される
20echo $sum
216

例3. 出力ファイルとして使う例

 1$ # txtディレクトリ内の.txtファイルについてサイズ最大・最小のファイルとファイル数を個別ファイルに出力
 2$ ls -l ./txt | grep .txt | sort -k 5,5 | \
 3> tee >(sed -n '2p' > head.txt) >(tail -n 1 > tail.txt) >(wc -l > wc.txt) > /dev/null
 4$
 5$ cat head.txt
 6-rw-r--r--   1 user  staff        4  1  9 08:35 min.txt
 7$ cat tail.txt
 8-rw-r--r--   1 user  staff    19788  2 23 13:36 max.txt
 9$ cat wc.txt
10      79

単語分割 (Word Splitting)

シェルは、パラメータ展開、コマンド置換、算術展開の結果のうち、二重引用符で囲まれていないものを単語分割のためにスキャンします。

シェルは IFS の各文字を区切り文字として扱い、これらの文字をフィールド終端文字として他の展開結果を単語に分割します。 IFS が未設定、またはその値がデフォルトの の場合、それまでの展開結果の先頭と末尾にある , , のシーケンスは無視され、先頭と末尾にない IFS 文字のシーケンスは単語の区切りとして使用されます。 IFS の値がデフォルト以外の場合、空白文字が IFS の値 (IFS 空白文字) に含まれている限り、単語の先頭と末尾にある space, tab, newline は無視されます。 IFS の空白文字以外の文字は、隣接する IFS 空白文字とともに、フィールドを区切ります。 IFS 空白文字のシーケンスも区切り文字として扱われます。 IFS の値が null の場合、単語分割は行われません。

明示的な null 引数 ("" または '') は保持され、空文字列としてコマンドに渡されます。 引用符で囲まれていない暗黙の null 引数は、値を持たないパラメータが展開された結果、削除されます。 値のないパラメータが二重引用符で囲まれて展開された場合、null 引数が保持され、空文字列としてコマンドに渡されます。引用符で囲まれた null 引数が、null でない単語の展開の一部として現れると、null 引数は削除されます。つまり、単語 -d'' は、単語分割と null 引数除去の後、-d になる。

展開が発生しない場合、分割は実行されないことに注意してください。

1$ IFS=,
2$ echo "a,b,c"
3a,b,c
4$ A="a,b,c"
5$ echo $A
6a b c
7$ IFS=
8$ echo $A
9a,b,c

パス名展開 (Pathname Expansion)

単語分割の後、-f オプションが設定されていない限り、bash は各単語をスキャンして *、?、および [ の文字を探します。 これらの文字のいずれかが出現すると、単語はパターンと見なされ、パターンに一致するファイル名のアルファベット順に並べ替えられたリストに置き換えられます。 一致するファイル名が見つからず、シェル オプション nullglob が無効になっている場合、単語は変更されません。 nullglob オプションが設定されていて、一致するものが見つからない場合、その単語は削除されます。 failglob シェル オプションが設定されていて、一致するものが見つからない場合、エラー メッセージが出力され、コマンドは実行されません。 シェル オプション nocaseglob が有効な場合、一致はアルファベットの大文字と小文字に関係なく実行されます。 パス名の展開にパターンが使用される場合、シェル オプション dotglob が設定されていない限り、名前の先頭またはスラッシュの直後の文字 「.」 は明示的に一致する必要があります。 パス名を照合する場合、スラッシュ文字は常に明示的に照合する必要があります。 それ以外の場合、「.」文字は特別に扱われません。 nocaseglob、nullglob、failglob、および dotglob シェル オプションの説明については、組み込みコマンド shopt の説明を参照。

GLOBIGNORE シェル変数を使用して、パターンに一致するファイル名のセットを制限できます。 GLOBIGNORE が設定されている場合、GLOBIGNORE のパターンの 1 つにも一致する一致する各ファイル名は、一致のリストから削除されます。 ファイル名「.」および「..」は、GLOBIGNORE が設定されていて null でない場合、常に無視されます。 しかし、GLOBIGNORE を null 以外の値に設定すると、dotglob シェル オプションが有効になるため、「.」で始まる他のすべてのファイル名が一致します。 「.」で始まるファイル名を無視するという古い動作を取得するには、「.*」を GLOBIGNORE のパターンの 1 つにします。 GLOBIGNORE が設定されていない場合、dotglob オプションは無効になります。

パターンマッチング

以下で説明する特殊なパターン文字以外の、パターンに現れるすべての文字は、それ自体に一致します。 パターン内に NUL 文字が出現しない場合があります。 バックスラッシュは次の文字をエスケープします。 エスケープするバックスラッシュは一致時に破棄されます。 文字どおりに一致させる場合は、特殊パターン文字を引用符で囲む必要があります。

特殊なパターン文字には次の意味があります。

*
null 文字列を含む任意の文字列に一致します。
?
任意の 1 文字に一致します。
[...]
囲まれた文字のいずれかに一致します。 ハイフンで区切られた文字のペアは、範囲式を示します。 現在のロケールの照合シーケンスと文字セットを使用して、これらの 2 つの文字を含めて並べ替えられるすべての文字が一致します。 [ に続く最初の文字が ! または ^ の場合、囲まれていない任意の文字が一致します。 範囲式の文字のソート順は、現在のロケールと LC_COLLATE シェル変数 (設定されている場合) の値によって決まります。 A - は、セットの最初または最後の文字として含めることで一致する場合があります。 ] は、セットの最初の文字として含めることで一致する場合があります。

[ と ] 内で、構文 [:class:] を使用して文字クラスを指定できます。ここで、class は POSIX 標準で定義されている次のクラスのいずれかです。
alnum alpha ascii blank cntrl digit graph Lower print punct space upper word xdigit
文字クラスは、そのクラスに属する任意の文字に一致します。 単語の文字クラスは、文字、数字、および文字 _ に一致します。

[ と ] 内で、構文 [=c=] を使用して等価クラスを指定できます。これは、文字 c と同じ照合重み (現在のロケールで定義されている) を持つすべての文字に一致します。

[ と ] 内では、構文 [.symbol.] は照合記号 symbol と一致します。

組み込みコマンド shopt を使用して extglob シェル オプションを有効にすると、いくつかの拡張パターンマッチング演算子が認識されます。 以下の説明では、pattern-list は | で区切られた 1 つ以上のパターンのリストです。 複合パターンは、次のサブパターンの 1 つまたは複数を使用して形成できます。

?(pattern-list)
指定されたパターンの 0 回または 1 回の出現に一致します
*(pattern-list)
指定されたパターンの 0 回以上の出現に一致します
+(pattern-list)
指定されたパターンの 1 つ以上の出現に一致します
@(pattern-list)
指定されたパターンの 1 つに一致します
!(pattern-list)
指定されたパターンの 1 つを除くすべてに一致します
 1$ shopt -s extglob
 2$ shopt extglob
 3extglob        	on
 4$ ls
 59  99  99x  99y  9x  9y  a99x  a99xy  a99y  a9x  a9xy  a9y
 6$ # ファイル名が a または b で始まり、数字が続き、x で終わらない場合にマッチ
 7$ ls ?(a|b)+([0-9])!(*x)
 89  99  99y  9y  a99xy  a99y  a9xy  a9y
 9$ # 失敗例。 !(*x) を !(x) とすると、x 一文字以外にマッチするため、99x, a99x もマッチする
10$ ls ?(a|b)+([0-9])!(x)
119  99  99x  99y  9y  a99x  a99xy  a99y  a9xy  a9y
12

クォートの削除 (Quote Removal)

 上記の展開の後、クォートで囲まれていない、上記の展開の結果ではない文字 \ ' " はすべて削除されます。

リダイレクション (REDIRECTION)

コマンドが実行される前に、その入力と出力は、シェルによって解釈される特別な表記法を使用してリダイレクトされる場合があります。 リダイレクトは、現在のシェル実行環境のファイルを開いたり閉じたりするためにも使用できます。 次のリダイレクト演算子は、単純なコマンド内の任意の場所に先行または出現するか、コマンドの後に続く場合があります。 リダイレクトは、表示された順序で左から右に処理されます。

以下の説明では、ファイル記述子(ディスクリプタ)番号が省略され、リダイレクト演算子の最初の文字が < の場合、リダイレクトは標準入力 (ファイル記述子 0) を参照します。 リダイレクト演算子の最初の文字が > の場合、リダイレクトは標準出力 (ファイル記述子 1) を参照します。

以下の説明でリダイレクト演算子に続く単語 word は、特に断りのない限り、ブレース展開、チルダ展開、パラメータ展開、コマンド置換、算術展開、引用符の削除、パス名展開、および単語分割の対象となります。 複数の単語に展開されると、bash はエラーを報告します。

リダイレクトの順序は重要であることに注意してください。 例えば、次のコマンドは、標準出力と標準エラーの両方をファイル dirlist に送りますが、

ls > dirlist 2>&1

一方で、次のコマンドは、標準出力が dirlist にリダイレクトされる前に、標準エラーが標準出力として複製されたため、標準出力のみをファイル dirlist に送信します。

ls 2>&1 > dirlist

次の表に示すように、Bash はいくつかのファイル名をリダイレクトで使用する場合に特別に処理します。

/dev/fd/fd
fd が有効な整数の場合、ファイル記述子 fd が複製されます。
/dev/stdin
ファイル記述子 0 が複製されます。
/dev/stdout
ファイル記述子 1 が複製されます。
/dev/stderr
ファイル記述子 2 が複製されます。
/dev/tcp/host/port
host が有効なホスト名またはインターネットアドレスで、port が整数のポート番号またはサービス名である場合、bash は対応するソケットへの TCP 接続を開こうとします。
/dev/udp/host/port
host が有効なホスト名またはインターネット アドレスで、port が整数のポート番号またはサービス名である場合、bash は対応するソケットへの UDP 接続を開こうとします。

ファイルのオープンまたは作成に失敗すると、リダイレクトが失敗します。

9 より大きいファイル記述子を使用するリダイレクトは、シェルが内部で使用するファイル記述子と競合する可能性があるため、注意して使用する必要があります。

入力のリダイレクト (Redirecting Input)

入力のリダイレクトにより、word の展開の結果の名前を持つファイルが、ファイル記述子 n、または n が指定されていない場合は標準入力 (ファイル記述子 0) で読み取るためにオープンします。

入力をリダイレクトするための一般的な書式は次のとおりです。

[n]<word

出力のリダイレクト (Redirecting Output)

出力のリダイレクトは、 word を展開した結果の名前を持つファイルを、ファイル記述子 n 、または n が指定されていない場合は標準出力(ファイル記述子 1)に書き込むためにオープンします。 ファイルが存在しない場合は作成され、存在する場合はゼロサイズに切り詰められます。

出力をリダイレクトする一般的な書式は次のとおりです。

[n]>[|]word

リダイレクト演算子が '>' で、かつ set 組み込み関数の noclobber オプションが有効になっている場合、 word を展開した結果の名前のファイルが存在し、かつ通常のファイルであれば、 リダイレクトは失敗します。 リダイレクト演算子が '>|' であるか、リダイレクト演算子が '>' で noclobber オプションが有効になっていない場合、 word で指定された名前のファイルが存在してもリダイレクションが試行されます。

リダイレクトされた出力の追加 (Appending Redirecting Output)

この方法で出力をリダイレクトすると、word を展開した結果の名前を持つファイルが、ファイル記述子 n に追加するために開かれます。 n が指定されていない場合は、標準出力 (ファイル記述子 1) に追加されます。 ファイルが存在しない場合は作成されます。

出力を追加するための一般的な形式は次のとおりです。

[n]>>word

標準出力と標準エラーのリダイレクト (Redirecting Standard Output and Standard Error)

Bash では、標準出力 (ファイル記述子 1) と標準エラー出力 (ファイル記述子 2) の両方を、この構成で word を展開した名前のファイルにリダイレクトできます。

標準出力と標準エラーのリダイレクトには、次の 2 つの形式があります。

&>word または >&word

2 つの形式のうち、最初の形式が優先されます。 これは意味的には以下と同じです。

>word 2>&1

ヒアドキュメント (Here Documents)

このタイプのリダイレクトは、(末尾に空白のない)word だけを含む行が現れるまで、現在のソースから入力を読むようにシェルに指示します。その時点までに読み込まれたすべての行が、コマンドに対する標準入力( n が指定されている場合はファイル記述子 n )として使用されます。

ヒアドキュメントの形式は次のとおりです。

[n]<<[-]word
	here-document
delimiter

word に対して、パラメータや変数の展開、コマンド置換、算術展開、またはファイル名展開は実行されません。 word の一部が引用符で囲まれている場合、delimiter は word の引用を削除した結果であり、hire-document の行は展開されません。 word が引用符で囲まれていない場合、hire-document のすべての行がパラメータ展開、コマンド置換、および算術展開の対象となり、文字シーケンス \<newline> は無視され、文字 '\', '$', および '`' を引用符で囲むには '\' を使用しなければなりません。

リダイレクト演算子が <<- の場合、先頭のすべてのタブ文字が入力行と delemiter を含む行から削除されます。 これにより、シェルスクリプト内の hire-document を自然な方法でインデントできます。

1$ while read; do $REPLY; done << word
2> echo "Hello, world!"
3> date
4> word
5"Hello, world!"
62024年 1月 2日 火曜日 10時23分58秒 JST

※上のコードで、ヒアドキュメントの終わりを示す word の右側に空白を入れてしまうと、 word は終わりと見做されず、引き続き入力を促すプロンプトが表示される。また、これをシェルスクリプトにして実行すると、以下のようなメッセージが出力される。空白は容易に気づかないため要注意。

1./sample.sh: line4 warning: here-document at line 1 delimited by end-of-file (wanted `word')

ヒアストリング (Here Strings)

ヒアドキュメントの変形で、形式は次のとおりです。

[n]<<<word

word はチルダ展開、パラメータ展開、変数展開、コマンド置換、算術展開、引用符除去される。ファイル名の展開と単語の分割は行われない。結果は、改行が付加された単一の文字列として、コマンドの標準入力( n が指定されている場合はファイル記述し n )に提供されます。

1$ # echo 結果をパイプで渡すより簡単かもしれない
2$ awk -F. -v col=2 '{print $col}' <<< "12.34.56.78"
334

ファイル記述子の複製 (Duplicating File Descriptors)

「ファイル記述子 fd を fd2 にコピーする」とは、「 fd が指しているファイル( file構造体 )を fd2 も指すようにする」ということです。

リダイレクト演算子

[n]<&word

は、入力ファイル記述子を複製するために使用されます。 word が1桁以上に展開されると、 n で示されるファイル記述子は、そのファイル記述子のコピーになります。 word の数字が入力用にオープンされているファイル記述子を指定していない場合、リダイレクトエラーが発生します。 word が '-' と評価された場合、ファイル記述子 n はクローズされます。 n が指定されない場合、標準入力(ファイル記述子0)が使用されます。

演算子

[n]>&word

は、出力ファイル記述子を複製するのと同様に使用されます。 n が指定されない場合、標準出力(ファイル記述子1)が使用されます。 word の数字が出力用にオープンされているファイル記述子を指定していない場合、リダイレクトエラーが発生します。 word が '-' と評価された場合、ファイル記述子 n はクローズされます。 特殊なケースとして、n が省略され、word が1桁以上の数字または '-' に展開されない場合、標準出力と標準エラー出力は、前述のようにリダイレクトされます。

例えば 1>&3 とすると、次の図のように、ファイル記述子3を1に複製します。 これにより 1 の向き先が変わります。

1exec 3> outfile  # 3をオープンして向き先をoutfileに設定
2ls dummy 1>&3    # 標準出力の向き先をoutfileに向ける(標準エラー出力は変更なし)
3exec 3>&-        # 3をクローズ

ファイル記述子の移動 (Moving File Descriptors)

リダイレクト演算子

[n]<&digit-

は、ファイル記述子 digit をファイル記述子 n に移動するか、n が指定されていない場合は標準入力 (ファイル記述子 0) に移動します。 digit は n に複製された後に閉じられます。

同様に、リダイレクト演算子

[n]>&digit-

は、ファイル記述子の digit をファイル記述子 n に移動するか、n が指定されていない場合は標準出力 (ファイル記述子 1) に移動します。

例えば 1>&3- とすると、次の図のように、ファイル記述子3を1に複製して、3をクローズします。

読み取りおよび書き込み用にファイル記述子を開く (Opening File Descriptors for Reading and Writing)

リダイレクト演算子

[n]<>word

は word の展開である名前のファイルが、ファイル記述子 n で、または n が指定されていない場合はファイル記述子 0 で、読み取りと書き込みの両方のために開かれます。 ファイルが存在しない場合は、作成されます。

エイリアス (ALIASES)

エイリアスを使用すると、単純なコマンドの最初の単語として文字列を使用するときに、文字列を単語に置き換えることができます。 シェルは、alias および unalias 組み込みコマンドで設定および設定解除できるエイリアスのリストを保持します (BUILTIN COMMANDSを参照)。 各単純コマンドの最初の単語が引用符で囲まれていない場合は、エイリアスがあるかどうかがチェックされます。 その場合、その単語はエイリアスのテキストに置き換えられます。 /, $, `, および = の文字と、シェルのメタ文字または上記の引用文字は、エイリアス名には使用できません。 置換テキストには、シェルのメタ文字を含む有効なシェル入力を含めることができます。 置換テキストの最初の単語のエイリアスがテストされますが、展開されるエイリアスと同一の単語は 2 回展開されません。 これは、たとえば ls を ls -F にエイリアスすることができ、bash は置換テキストを再帰的に展開しようとしないことを意味します。 エイリアス値の最後の文字が空白の場合は、エイリアスに続く次のコマンド単語もエイリアス展開のためにチェックされます。

エイリアスは、alias コマンドで作成およびリストされ、unalias コマンドで削除されます。

置換テキストで引数を使用するメカニズムはありません。 引数が必要な場合は、シェル関数を使用する必要があります (FUNCTIONSを参照)。

シェルが対話型でない場合、expand_aliases シェル オプションが shopt を使用して設定されていない限り、エイリアスは展開されません (組み込みコマンド shopt の説明を参照)。

エイリアスの定義と使用に関するルールはやや混乱しています。 Bash は、その行のコマンドを実行する前に、少なくとも 1 行の完全な入力を常に読み取ります。 コマンドの実行時ではなく、読み取り時にエイリアスが展開されます。 したがって、別のコマンドと同じ行にあるエイリアス定義は、入力の次の行が読み込まれるまで有効になりません。 その行のエイリアス定義に続くコマンドは、新しいエイリアスの影響を受けません。 この動作は、関数の実行時にも問題になります。 エイリアスは、関数定義自体が複合コマンドであるため、関数の実行時ではなく、関数定義の読み取り時に展開されます。 結果として、関数で定義されたエイリアスは、その関数が実行されるまで使用できません。 安全のために、エイリアス定義は常に別の行に置き、複合コマンドではエイリアスを使用しないでください。

ほとんどすべての目的で、エイリアスはシェル関数に取って代わられています。

関数 (FUNCTIONS)

SHELL GRAMMAR で説明したように、定義済みシェル関数は、後で実行するために一連のコマンドを格納します。 シェル関数の名前が単純なコマンド名として使用されると、その関数名に関連付けられたコマンドのリストが実行されます。 関数は現在のシェルのコンテキストで実行されます。 それらを解釈するための新しいプロセスは作成されません (これをシェルスクリプトの実行と比較してください)。 関数が実行されると、関数への引数は、その実行中に位置パラメータになります。 特別なパラメータ # が更新され、変更が反映されます。 特殊パラメータ 0 は変更されません。

 1$ #例)関数内の位置パラメータ、特殊パラメータの確認
 2$ cat sample.sh
 3#!/bin/bash
 4function func(){
 5  echo '----- func start -----'
 6  echo $0
 7  echo $1
 8  echo $#
 9  echo '----- func end   -----'
10}
11func func_param1 func_param2
12echo $0
13echo $1
14echo $#
15exit 0;
16$ ./sample.sh main_param
17----- func start -----
18./sample.sh     ← 特殊パラメータ 0 は変更されない!
19func_param1     ← 位置パラメータは関数の引数が設定される!
2020 以外の特殊パラメータは関数の引数に応じて変更される!
21----- func end   -----
22./sample.sh
23main_param
241

FUNCNAME 変数の最初の要素は、関数の実行中に関数の名前に設定されます。 シェル実行環境の他のすべての側面は、関数とその呼び出し元の間で同一です。ただし、 DEBUGRETURN トラップ(組み込みコマンド trap を参照)が継承されない場合を除きます。 関数に trace 属性(組み込みコマンド declare を参照)が指定されておらず、また、組み込みコマンド set により -o functrace シェル オプションが有効になっていない限り、 DEBUGRETURN トラップは継承されません。

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

 1$ #例)localで宣言された変数だけがローカル変数となる。
 2$ cat sample.sh
 3#!/bin/bash
 4function func(){
 5  local var_l
 6  var_l="local"
 7  var_g1="global1"
 8  echo "[" $var_l "] in func"
 9  echo "[" $var_g1 "] in func"
10  echo "[" $var_g2 "] in func"
11}
12var_g2="global2"
13func
14echo "[" $var_l "] in main"
15echo "[" $var_g1 "] in main"
16echo "[" $var_g2 "] in main"
17exit 0;
18$ ./sample.sh
19[ local ] in func
20[ global1 ] in func
21[ global2 ] in func
22[ ] in main
23[ global1 ] in main
24[ global2 ] in main
25$ 

組み込みコマンド return が関数内で実行される場合、関数は完了し、関数呼び出しの後の次のコマンドで実行が再開されます。 RETURN トラップに関連付けられたコマンドは、実行が再開される前に実行されます。 関数が完了すると、位置パラメータと特殊パラメータ # の値は、関数の実行前の値に復元されます。

関数名と定義は、declare または typeset 組み込みコマンドの -f オプションでリストできます。 declare または typeset-F オプションは、関数名のみをリストします( extdebug シェル オプションが有効な場合は、オプションでソース ファイルと行番号も表示されます)。 サブシェルが自動的に組み込みコマンド export への -f オプションで定義されるように、関数をエクスポートすることができます。組み込みコマンド unset-f オプションを使用すると、関数定義を削除できます。 同じ名前のシェル関数と変数は、シェルの子に渡される環境内で複数の同じ名前のエントリになる可能性があることに注意してください。 これにより問題が発生する可能性がある場合は注意が必要です。

関数は再帰的かもしれません。 再帰呼び出しの回数に制限はありません。

算術評価 (ARITHMETIC EVALUATION)

シェルでは、特定の状況下で算術式を評価できます (組み込みコマンド let および declare算術展開を参照)。 評価はオーバーフローのチェックなしで固定幅整数で行われますが、0 による除算はトラップされ、エラーとしてフラグが立てられます。 演算子とその優先順位、結合規則、および値は、C 言語と同じです。 次の演算子のリストは、同等の優先順位の演算子のレベルにグループ化されています。 レベルは、優先度の低い順にリストされています。

id++ id--
可変ポストインクリメントおよびポストデクリメント
++id --id
可変プレインクリメントおよびプレデクリメント
- +
単項マイナスとプラス
! ~
論理的およびビットごとの否定
**
べき乗
* / %
掛け算、割り算、余り
+ -
加算、減算
<< >>
左右のビットシフト
<= >= < >
比較
== !=
等号と不等号
&
ビットごとの AND
^
ビットごとの排他的 OR
|
ビットごとの OR
&&
論理積
||
論理和
expr?expr:expr
条件演算子
= *= /= %= += -= <<= >>= &= ^= |=
代入
expr1 , expr2
コンマ

シェル変数はオペランド(演算子以外の式の構成要素)として使用できます。 パラメータ展開は、式が評価される前に実行されます。 式内では、パラメータ展開構文を使用せずにシェル変数を名前で参照することもできます。 null または未設定のシェル変数は、パラメータ展開構文を使用せずに名前で参照すると、0 と評価されます。 変数の値は、変数が参照されるとき、または declare -i を使用して整数属性が与えられた変数に値が割り当てられるときに、算術式として評価されます。 null 値は 0 に評価されます。シェル変数は、式で使用するために整数属性をオンにする必要はありません。

先頭に 0 がある定数は、8 進数として解釈されます。 先頭の 0x または 0X は 16 進数を表します。 それ以外の場合、数値は [base#]n の形式を取ります。ここで、base は算術基数を表す 2 ~ 64 の 10 進数で、n はその基数の数値です。 base# を省略すると、base 10 が使用されます。 9 より大きい数字は、小文字、大文字、@、および _ の順序で表されます。 基数が 36 以下の場合、10 から 35 までの数値を表すために小文字と大文字を区別なく使用できます。

1$ echo $((011+8))   # 11は8進数表記
217
3$ echo $((0x11+8))  # 11は16進数表記
425
5$ echo $((2#11+8))  # 11は2進数表記
611

演算子は優先順位に従って評価されます。 括弧内のサブ式が最初に評価され、上記の優先ルールをオーバーライドする場合があります。

条件式 (CONDITIONAL EXPRESSIONS)

条件式は、[[ 複合コマンドと test および [ 組み込みコマンドで使用され、ファイル属性をテストし、文字列と算術比較を実行します。 式は、次の単項またはバイナリ プライマリから形成されます。 いずれかのプライマリへのfile引数が /dev/fd/n の形式である場合、ファイル記述子 n がチェックされます。 いずれかのプライマリへのfile引数が /dev/stdin、/dev/stdout、または /dev/stderr のいずれかである場合、ファイル記述子 0、1、または 2 がそれぞれチェックされます。

特に指定されていない限り、ファイルを操作するプライマリはシンボリック リンクをたどり、リンク自体ではなくリンクのターゲットを操作します。

-a file
fileが存在する場合は true
-b file
fileが存在し、ブロック スペシャル ファイルである場合はtrue
-c file
fileが存在し、それがキャラクター スペシャル ファイルである場合はtrue
-d file
fileが存在し、ディレクトリである場合は true
-e file
fileが存在する場合は true
-f file
fileが存在し、通常のファイルである場合は true
-g file
fileが存在し、set-group-id である場合は true
-h file
fileが存在し、シンボリック リンクの場合は true
-k file
fileが存在し、そのstickyビットが設定されている場合はtrue
-p file
fileが存在し、名前付きパイプ (FIFO) である場合は true
-r file
fileが存在し、読み取り可能であればtrue
-s file
fileが存在し、サイズが 0 より大きい場合は true
-t fd
file記述子 fd が開いていて、端末を参照している場合はtrue
-u file
fileが存在し、その set-user-id ビットが設定されている場合は true
-w file
fileが存在し、書き込み可能であればtrue
-x file
fileが存在し、実行可能であればtrue
-O file
fileが存在し、有効なユーザー ID によって所有されている場合は true
-G file
fileが存在し、有効なグループ ID によって所有されている場合は true
-L file
fileが存在し、シンボリック リンクの場合は true
-S file
fileが存在し、ソケットである場合は true
-N file
fileが存在し、最後に読み取られてから変更されている場合は true
file1 -nt file2
file1 が file2 より (変更日に従って) 新しい場合、または file1 が存在し、file2 が存在しない場合は true
file1 -ot file2
file1 が file2 より古い場合、または file2 が存在し、file1 が存在しない場合は true
file1 -ef file2
file1 と file2 が同じデバイス番号と inode 番号を参照している場合は true
-o オプション名
シェルオプション optname が有効な場合は true。 組み込みコマンド set の -o オプションの説明の下にあるオプションのリストを参照。
-z string
string の長さがゼロの場合は true
string
-n string
stringの長さがゼロでない場合は真
string1 == string2
文字列が等しい場合は true。 = は、厳密な POSIX 準拠のために == の代わりに使用できます。
string1 != string2
文字列が等しくない場合は true
string1 < string2
現在のロケールでstring1 とstring2 を辞書順で並び替えたときに、string1 がstring2 の前になる場合は true
string1 > string2
現在のロケールでstring1 とstring2 を辞書順で並び替えたときに、string1 がstring2 の後になる場合は true
arg1 OP arg2
OP は、-eq、-ne、-lt、-le、-gt、または -ge のいずれかです。 これらの算術二項演算子は、arg1 が arg2 と等しい、等しくない、より小さい、以下、より大きい、または以上の場合に true を返します。 arg1 と arg2 は正または負の整数です。

単純なコマンド展開 (SIMPLE COMMAND EXPANSION)

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

  1. パーサーが変数代入(コマンド名の前にあるもの) およびリダイレクションと判断した単語は、後で処理するために保存されます。
  2. 変数代入でもリダイレクションでもない単語が展開されます。 展開後に単語が残っている場合、最初の単語がコマンド名と見なされ、残りの単語が引数になります。
  3. リダイレクションは、上記の「リダイレクション」で説明したように実行されます。
  4. 変数代入の = の後のテキストは、変数代入する前に、チルダ展開、パラメータ展開、コマンド置換、算術展開、引用符の削除が行われます。
1$ A=a@b@c
2$ IFS=@ echo $A  # IFS=@の代入前に$Aが展開されるので、"a b c"とはならない
3a@b@c

コマンド名が残らなかった場合、変数代入の結果は現在のシェル環境に影響します。 それ以外の場合、変数は実行されたコマンドの環境に追加され、現在のシェル環境には影響しません。 読み取り専用変数に代入しようとするとエラーが発生し、コマンドはゼロ以外のステータスで終了します。

1$ cat sample.sh
2#!/bin/bash
3echo $A
4$ A="test" ./sample.sh  # 変数Aはコマンドの環境に追加される(exportせずに参照可能)
5test
6$ echo ${A-"A is unset"}  # シンプルコマンドの代入は現在シェルには影響しない
7A is unset

コマンド名が返されない場合、リダイレクションは実行されますが、現在のシェル環境には影響しません。 リダイレクションエラーが発生すると、コマンドはゼロ以外のステータスで終了します。

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

単純なコマンド(Simple Commands)についても参照してください。

コマンド実行 (COMMAND EXECUTION)

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

コマンド名にスラッシュが含まれていない場合、シェルはそれを見つけようとします。 その名前のシェル関数が存在する場合、その関数は FUNCTIONS で説明したように呼び出されます。 名前が関数と一致しない場合、シェルは組み込みコマンドのリストを検索します。 一致が見つかった場合、その組み込みコマンドが呼び出されます。

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

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

ファイルが実行可能形式でないために実行が失敗し、かつファイルがディレクトリでもない場合、それはシェル スクリプト (シェル コマンドを含むファイル) であると見なされます。 それを実行するためにサブシェルが生成されます。 このサブシェルは自分自身を再初期化するため、新しいシェルがスクリプトを処理するために呼び出されたかのように効果がありますが、親によって記憶されたコマンドの場所 (組み込みコマンド hash を参照) は子にも引き継がれます。

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

コマンド実行環境 (COMMAND EXECUTION ENVIRONMENT)

シェルには、以下で構成される実行環境があります。

  • 組み込みコマンド exec に提供されたリダイレクトによって変更された、起動時にシェルによって継承されたファイルを開く
  • cd、pushd、または popd によって設定された、または呼び出し時にシェルによって継承された現在の作業ディレクトリ
  • umask によって設定された、またはシェルの親から継承されたファイル作成モード マスク
  • trapによって設定された現在のトラップ
  • 変数代入やset コマンドや親シェルからの継承により設定されたシェル パラメータ
  • 実行中に定義されたシェル関数、または環境内のシェルの親から継承されたシェル関数
  • 呼び出し時に有効化されるオプション (デフォルトまたはコマンドライン引数を使用) または設定によって有効化されるオプション
  • shopt によって有効化されるオプション
  • alias で定義されたシェル エイリアス
  • バックグラウンド ジョブのプロセスID、$$ の値、$PPID の値など、さまざまなプロセスID

組み込みコマンドやシェル関数以外の単純なコマンドを実行する場合は、以下で構成される別の実行環境で呼び出されます。 特に明記しない限り、値はシェルから継承されます。

  • シェルの開いているファイル、およびコマンドへのリダイレクトによって指定された変更と追加
  • 現在の作業ディレクトリ
  • ファイル作成モード マスク
  • エクスポート用にマークされたシェル変数と関数、および環境に渡されたコマンド用にエクスポートされた変数
  • シェルによってキャッチされたトラップは、シェルの親から継承された値にリセットされ、シェルによって無視されたトラップは無視されます。

この別の環境で呼び出されたコマンドは、シェルの実行環境に影響を与えることはできません。

コマンド置換、括弧でグループ化されたコマンド、および非同期コマンドは、シェルによって捕捉されたトラップが呼び出し時にシェルがその親から継承した値にリセットされることを除いて、シェル環境の複製であるサブシェル環境で呼び出されます。 パイプラインの一部として呼び出される組み込みコマンドも、サブシェル環境で実行されます。 サブシェル環境に加えられた変更は、シェルの実行環境に影響を与えることはできません。

コマンドの後に & が続き、ジョブ制御がアクティブでない場合、コマンドのデフォルトの標準入力は空のファイル /dev/null です。 それ以外の場合、呼び出されたコマンドは、リダイレクトによって変更された呼び出しシェルのファイル記述子を継承します。

環境 (ENVIRONMENT)

プログラムが呼び出されると、environmentと呼ばれる文字列の配列が与えられます。 これは、name-value という形式の名前と値のペアのリストです。

シェルには、環境を操作する方法がいくつか用意されています。 呼び出し時に、シェルは独自の環境をスキャンし、見つかった名前ごとにパラメータを作成し、子プロセスにエクスポートするように自動的にマークします。 実行されたコマンドは環境を継承します。 export および declare -x コマンドを使用すると、パラメータと関数を環境に追加したり、環境から削除したりできます。 環境内のパラメータの値が変更された場合、新しい値が環境の一部になり、古い値が置き換えられます。 実行されたコマンドによって継承される環境は、シェルの初期環境で構成されます。その値は、シェルで変更される可能性があり、unset コマンドによって削除されたペアを差し引いたものと、export および declare -x コマンドによる追加が含まれます。

上記の PARAMETERS で説明されているように、単純なコマンドまたは関数の環境は、パラメータの割り当てを前に付けることで一時的に拡張できます。 これらの代入ステートメントは、そのコマンドによって表示される環境のみに影響します。

-k オプションが設定されている場合 (組み込みコマンド set の説明を参照)、コマンド名の前にあるものだけでなく、すべてのパラメータ割り当てがコマンドの環境に配置されます。

bash が外部コマンドを呼び出すと、変数 _ がコマンドの完全なファイル名に設定され、その環境でそのコマンドに渡されます。

終了ステータス (EXIT STATUS)

シェルの目的のために、ゼロの終了ステータスで終了するコマンドは成功しました。 ゼロの終了ステータスは成功を示します。 ゼロ以外の終了ステータスは失敗を示します。 コマンドが致命的なシグナル N で終了すると、bash は 128+N の値を終了ステータスとして使用します。

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

展開またはリダイレクト中のエラーが原因でコマンドが失敗した場合、終了ステータスは 0 より大きくなります。

シェル組み込みコマンドは、成功した場合は 0 (true) のステータスを返し、実行中にエラーが発生した場合はゼロ以外 (false) を返します。 すべての組み込みコマンドは終了ステータス 2 を返し、不適切な使用法を示します。

Bash 自体は、構文エラーが発生しない限り、最後に実行されたコマンドの終了ステータスを返します。構文エラーが発生した場合は、ゼロ以外の値で終了します。 以下の exit 組み込みコマンドも参照。

シグナル (SIGNALS)

bash が対話型の場合、トラップがない場合は SIGTERM を無視し (kill 0 が対話型シェルを強制終了しないようにするため)、SIGINT をキャッチして処理します (組み込みコマンド wait が中断可能になるようにするため)。 いずれの場合も、bash は SIGQUIT を無視します。 ジョブ制御が有効な場合、bash は SIGTTIN、SIGTTOU、および SIGTSTP を無視します。

bash によって実行される非組み込みコマンドには、シェルが親から継承した値に設定されたシグナル ハンドラーがあります。 ジョブ制御が有効でない場合、非同期コマンドは、これらの継承されたハンドラーに加えて、SIGINT と SIGQUIT を無視します。 コマンド置換の結果として実行されるコマンドは、キーボード生成のジョブ制御シグナル SIGTTIN、SIGTTOU、および SIGTSTP を無視します。

デフォルトでは、シェルは SIGHUP を受け取ると終了します。 終了する前に、対話型シェルは、実行中または停止中のすべてのジョブに SIGHUP を再送信します。 停止したジョブには SIGCONT が送信され、SIGHUP を確実に受信できるようになります。 シェルが特定のジョブにシグナルを送信しないようにするには、ジョブ テーブルから組み込みコマンド disown (BUILTIN COMMANDSを参照) を使用して削除するか、disown -h を使用して SIGHUP を受信しないようにマークする必要があります。

huponexit シェル オプションが shopt で設定されている場合、対話型ログイン シェルが終了すると、bash はすべてのジョブに SIGHUP を送信します。

bash がコマンドの完了を待っているときに、トラップが設定されたシグナルを受信した場合、コマンドが完了するまでトラップは実行されません。 bash が組み込みコマンド wait を介して非同期コマンドを待機している場合、トラップが設定されているシグナルを受信すると、組み込みコマンド wait は 128 より大きい終了ステータスですぐに戻り、その直後にトラップが実行されます。

主なシグナル

シグナル動作説明
SIGHUP1Term制御端末のハングアップ検出、または制御しているプロセスの死
SIGINT2Termキーボードからの割り込み( 通常 ctrl + c )
SIGQUIT3Coreキーボードによる中止 ( ctrl + \ )
SIGKILL9Term強制終了。 kill コマンドで明示的に発生させる。 キャッチしたり無視できない
SIGTERM15Term強制終了。 kill コマンドがデフォルトで発生させる。 キャッチしたり無視できる
SIGSTOP17Stopプロセスの一時停止
SIGTSTP18Stop端末より入力 ( ctrl + z ) された一時停止
SIGCONT19Cont一時停止からの再開

※ 値(シグナル番号)は環境により異なる。使用できるシグナルと値は kill -lman 7 signal などで確認できる。
※ 参考サイト: シグナル (Unix)

擬似シグナル

以下の擬似的なシグナルを trap することが可能です。 詳細は trap を参照。

シグナル説明
EXIT0シェルスクリプト終了時
ERR単純なコマンドが 0 以外の終了ステータスのとき
DEBUGコマンド、シェル関数の実行前
RETURNシェル関数、組み込みコマンドの . や source で指定したスクリプトの実行後

ジョブ制御 (JOB CONTROL)

ジョブ制御とは、プロセスの実行を選択的に停止 (一時停止) し、後で実行を継続 (再開) する機能を指します。 ユーザーは通常、システムのターミナル ドライバーと bash が共同で提供する対話型インターフェイスを介して、この機能を使用します。

シェルは、ジョブを各パイプラインに関連付けます。 現在実行中のジョブのテーブルを保持します。これは、jobs コマンドで一覧表示できます。 bash がジョブを非同期的に (バックグラウンドで) 開始すると、次のような行が出力されます。

[1] 25647

このジョブがジョブ番号 1 であり、このジョブに関連付けられたパイプライン内の最後のプロセスのプロセスID が 25647 であることを示します。単一のパイプライン内のすべてのプロセスは、同じジョブのメンバーです。 Bash は、ジョブ制御の基礎としてジョブの抽象化を使用します。

ジョブ制御へのユーザー インターフェイスの実装を容易にするために、オペレーティング システムは、現在のターミナル プロセス グループ ID の概念を維持します。 このプロセス グループのメンバー (プロセス グループ ID が現在のターミナル プロセス グループ ID と等しいプロセス) は、SIGINT などのキーボード生成シグナルを受け取ります。 これらのプロセスは、フォアグラウンドにあると言われています。 バックグラウンド プロセスは、プロセス グループ ID が端末のものとは異なるプロセスです。 このようなプロセスは、キーボードで生成された信号の影響を受けません。 端末からの読み取りまたは端末への書き込みが許可されるのは、フォアグラウンド プロセスのみです。 端末からの読み取り (書き込み) を試みるバックグラウンド プロセスには、端末ドライバーによって SIGTTIN (SIGTTOU) シグナルが送信されます。

bash が実行されているオペレーティング システムがジョブ制御をサポートしている場合、bash にはそれを使用するための機能が含まれています。 プロセスの実行中に中断文字 (通常は ^Z、Control-Z) を入力すると、そのプロセスが停止し、制御が bash に戻ります。 遅延サスペンド文字 (通常は ^Y、Control-Y) を入力すると、プロセスが端末から入力を読み取ろうとしたときにプロセスが停止し、制御が bash に戻されます。 ユーザーは、bg コマンドを使用してバックグラウンドで続行するか、fg コマンドを使用してフォアグラウンドで続行するか、kill コマンドを使用してジョブを強制終了して、このジョブの状態を操作できます。 ^Z はすぐに有効になり、保留中の出力と先行入力が破棄されるという追加の副作用があります。

シェルでジョブを参照するには、いくつかの方法があります。 文字 % はジョブ名を示します。 ジョブ番号 n は、%n と呼ばれることがあります。 ジョブは、ジョブを開始するために使用される名前の接頭辞、またはコマンド ラインに表示される部分文字列を使用して参照することもできます。 たとえば、%ce は停止した ce ジョブを表します。 プレフィックスが複数のジョブに一致する場合、bash はエラーを報告します。 一方、%?ce を使用すると、コマンド ラインに文字列 ce を含むすべてのジョブが参照されます。 部分文字列が複数のジョブに一致する場合、bash はエラーを報告します。 シンボル %% および %+ は、現在のジョブのシェルの概念を参照します。これは、フォアグラウンドにあったか、バックグラウンドで開始されたときに最後に停止されたジョブです。 前のジョブは %- を使用して参照できます。 ジョブに関する出力 (例: jobs コマンドの出力) では、現在のジョブには常に + のフラグが付けられ、前のジョブには - のフラグが付けられます。 単一の % (付随するジョブ指定なし) も、現在のジョブを参照します。

単純にジョブに名前を付けるだけで、そのジョブをフォアグラウンドにすることができます: %1 は「fg %1」の同義語で、ジョブ 1 をバックグラウンドからフォアグラウンドに移動します。 同様に、「%1 &」はバックグラウンドでジョブ 1 を再開します。これは「bg %1」と同等です。

プロンプト (PROMPTING)

対話的に実行する場合、bash は、コマンドを読み取る準備ができたときにプライマリ プロンプト PS1 を表示し、コマンドを完了するためにさらに入力が必要なときにセカンダリ プロンプト PS2 を表示します。 Bash では、バックスラッシュでエスケープされた多数の特殊文字を挿入することで、これらのプロンプト文字列をカスタマイズできます。これらの文字は次のようにデコードされます。

\a
ASCII ベル文字 (07)
\d
「平日月日」形式の日付 (例: 「5 月 26 日火曜日」)
\D{format}
formatはstrftime(3) に渡され、結果はプロンプト文字列に挿入されます。 空のformatは、ロケール固有の時間表現になります。 ブレースは必須です。
\e
ASCII エスケープ文字 (033)
\h
最初の「.」までのホスト名
\H
ホスト名
\j
シェルによって現在管理されているジョブの数
\l
シェルの端末デバイス名のベース名
\n
newline
\r
carriage return
\s
シェルの名前、$0 のbasename (最後のスラッシュに続く部分)
\t
24 時間形式の HH:MM:SS 形式の現在の時刻
\T
12 時間 HH:MM:SS 形式の現在の時刻
\@
午前/午後 12 時間形式の現在の時刻
\A
24 時間 HH:MM 形式の現在の時刻
\u
現在のユーザーのユーザー名
\v
bash のバージョン (例: 2.00)
\V
bash のリリース、バージョン + パッチ レベル (例: 2.00.0)
\w
現在の作業ディレクトリ ($HOME はチルダで省略)
\W
現在の作業ディレクトリのベース名で、$HOME はチルダで省略されます
\!
このコマンドの履歴番号
\#
このコマンドのコマンド番号
\$
有効な UID が 0 の場合は #、それ以外の場合は $
\nnn
8 進数 nnn に対応する文字
\\
バックスラッシュ
\[
非表示文字のシーケンスを開始します。これは、端末制御シーケンスをプロンプトに埋め込むために使用できます
\]
非表示文字のシーケンスを終了します

通常、コマンド番号と履歴番号は異なります。コマンドの履歴番号は履歴リスト内の位置であり、履歴ファイルから復元されたコマンドが含まれる場合があります (HISTORY を参照)。一方、コマンド番号はシーケンス内の位置です。 現在のシェル セッション中に実行されたコマンドの数。 文字列がデコードされた後、prompvars シェル オプションの値に従って、パラメータ展開、コマンド置換、算術展開、および引用符の削除によって展開されます (以下の「組み込みコマンド」の shopt コマンドの説明を参照)。 シェルは、ジョブの状態が変わるたびにすぐに学習します。 通常、bash は、他の出力を中断しないように、ジョブのステータスの変化を報告する前に、プロンプトを表示する直前まで待機します。 set 組み込みコマンドの -b オプションが有効になっている場合、bash はそのような変更をただちに報告します。 SIGCHLD のトラップは、終了する各子に対して実行されます。

ジョブの停止中に bash を終了しようとすると、シェルは警告メッセージを出力します。 次に、jobs コマンドを使用してそれらのステータスを調べることができます。 コマンドを介さずに 2 回目の終了を試みると、シェルは別の警告を出力せず、停止したジョブは終了します。

READLINE (行入力支援ライブラリ)

これは、シェルの呼び出し時に --noediting オプションが指定されていない限り、対話型シェルを使用するときに入力の読み取りを処理するライブラリです。 デフォルトでは、行編集コマンドは emacs のコマンドに似ています。 vi スタイルの行編集インターフェイスも利用できます。 シェルの実行後に行編集をオフにするには、+o emacs または +o vi オプションを組み込みコマンド set に使用します (BUILTIN COMMANDSを参照)。

Readline 表記法 (Readline Notation)

このセクションでは、emacs スタイルの表記法を使用してキーストロークを示します。 コントロール キーは C-key で表されます。たとえば、C-n は Control-N を意味します。 同様に、メタ キーは M-key で示されるため、M-x は Meta-X を意味します。 (メタ キーのないキーボードでは、M-x は ESC x を意味します。つまり、Escape キーを押してから x キーを押します。これにより、ESC がメタ プレフィックスになります。M-C-x の組み合わせは、ESC-Control-x を意味するか、Escape キーを押してから Control キーを押したままにします。 x キーを押しながらキーを押します。)

readline コマンドには、通常は繰り返し回数として機能する数値引数を指定できます。 ただし、重要なのは引数の符号である場合もあります。 順方向に動作するコマンド (kill-line など) に負の引数を渡すと、そのコマンドは逆方向に動作します。 引数付きの動作がこれとは異なるコマンドを以下に示します。

コマンドがテキストを killing するように記述されている場合、削除されたテキストは将来の検索のために保存されます(ヤンク)。 kill されたテキストは kill ring に保存されます。 連続して kill すると、テキストが 1 つのユニットに蓄積され、一度にヤンクできます。 テキストを kill しないコマンドは、kill ring でテキストのチャンクを分離します。

Readline の初期化 (Readline Initialization)

readline は、コマンドを初期化ファイル (inputrc ファイル) に入れることによってカスタマイズされます。 このファイルの名前は、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 では、キーが押されたときに挿入される文字列にキーをバインドできます (マクロ)。

Readline キーバインディング

inputrc ファイルでキー バインドを制御するための構文は単純です。 必要なのは、コマンドの名前またはマクロのテキストと、バインド先のキー シーケンスだけです。 名前は 2 つの方法のいずれかで指定できます: シンボリック キー名として、場合によっては Meta- または Control- プレフィックスを使用するか、キー シーケンスとして指定します。

keyname:function-name またはマクロの形式を使用する場合、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'' を行に)。

2 番目の形式 "keyseq":function-name or 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 ~ はテキスト「ファンクション キー 1」を挿入するためにバインドされています。

GNU Emacs スタイルのエスケープ シーケンスの完全なセットは次のとおりです。

\C-
コントロールプレフィックス
\M-
メタ プレフィックス
\e
エスケープ文字
\\
バックスラッシュ
\"
リテラル "
\'
リテラル '

GNU Emacs スタイルのエスケープ シーケンスに加えて、バックスラッシュ エスケープの 2 番目のセットが利用可能です。

\a
アラート (ベル)
\b
バックスペース
\d
削除
\f
フォーム フィード
\n
newline
\r
carriage return
\t
水平タブ
\v
垂直タブ
\nnn
値が 8 進数値 nnn (1 ~ 3 桁) である 8 ビット文字
\xHH
値が 16 進値 HH (1 桁または 2 桁の 16 進数) である 8 ビット文字

マクロのテキストを入力するときは、一重引用符または二重引用符を使用してマクロ定義を示す必要があります。 引用符で囲まれていないテキストは、関数名と見なされます。 マクロ本体では、上記のバックスラッシュ エスケープが展開されます。 バックスラッシュは、" や ' など、マクロ テキスト内の他の文字を引用します。

Bash では、組み込みの bind コマンドを使用して、現在の readline キー バインドを表示または変更できます。 編集モードは、組み込みコマンド set に -o オプションを使用することにより、インタラクティブな使用中に切り替えることができます (BUILTIN COMMANDSを参照)。

Readline 変数

Readline には、その動作をさらにカスタマイズするために使用できる変数があります。 変数は、次の形式のステートメントを使用して inputrc ファイルに設定できます。

set variable-name value

特に明記されていない限り、readline 変数は (大文字と小文字を区別せずに) On または Off の値を取ることができます。 認識できない変数名は無視されます。 変数値が読み取られる場合、空または null 値、"on" (大文字と小文字を区別しない)、および "1" は On と同等です。 他のすべての値は Off と同じです。 変数とそのデフォルト値は次のとおりです。

bell-style (audible)
readline が端末のベルを鳴らしたいときに何が起こるかを制御します。 none に設定すると、readline はベルを鳴らしません。 visible に設定すると、readline は可視ベルがあればそれを使用します。 audible に設定すると、readline は端末のベルを鳴らそうとします。
bind-tty-special-chars (On)
On に設定すると、readline は、カーネルのターミナル ドライバによって特別に扱われる制御文字を、対応する readline にバインドしようとします。
comment-begin (#)
readline insert-comment コマンドの実行時に挿入される文字列。 このコマンドは、emacs モードでは M-# にバインドされ、vi コマンド モードでは # にバインドされます。
completion-ignore-case (Off)
On に設定すると、readline は大文字と小文字を区別しない方法でファイル名の照合と補完を実行します。
completion-query-items (100)
これは、possible-completions コマンドによって生成された可能な補完の数を表示することについて、いつユーザーに照会するかを決定します。 ゼロ以上の任意の整数値に設定できます。 可能な補完の数がこの変数の値以上である場合、ユーザーはそれらを表示するかどうかを尋ねられます。 それ以外の場合は、単に端末にリストされます。
convert-meta (On)
On に設定すると、readline は、8 番目のビットを取り除き、エスケープ文字をプレフィックスとして (実際には、メタプレフィックスとしてエスケープを使用して)、8 番目のビットが設定された文字を ASCII キー シーケンスに変換します。
disable-completion (Off)
On に設定すると、readline は単語の補完を禁止します。 補完文字は、自己挿入にマップされているかのように行に挿入されます。
editing-mode (emacs)
readline が emacs や vi と同様の一連のキー割り当てで始まるかどうかを制御します。 edit-mode は、emacs または vi のいずれかに設定できます。
enable-keypad (Off)
On に設定すると、readline は呼び出されたときにアプリケーションのキーパッドを有効にしようとします。 一部のシステムでは、矢印キーを有効にするためにこれが必要です。
expand-tilde (Off)
on に設定すると、readline が単語補完を試行するときにチルダ展開が実行されます。
history-preserve-point (Off)
on に設定すると、履歴コードは、前の履歴または次の履歴で取得された各履歴行の同じ位置に point を配置しようとします。
horizontal-scroll-mode (Off)
On に設定すると、readline が表示に 1 行を使用し、入力が画面幅より長くなると、新しい行に折り返すのではなく、1 画面行で水平にスクロールします。
input-meta (Off)
On に設定すると、readline は 8 ビット入力を有効にします (つまり、読み取る文字から上位ビットを削除しません)。端末が何をサポートできると主張しているかにかかわらずです。 メタフラグという名前は、この変数の同義語です。
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 コマンドと同等です。 emacs は emacs-standard と同等です。 デフォルト値は emacs です。 edit-mode の値もデフォルトのキーマップに影響します。
mark-directories (On)
On に設定すると、完全なディレクトリ名にスラッシュが追加されます。
mark-modified-lines (Off)
On に設定すると、変更された履歴行の前にアスタリスク (*) が表示されます。
mark-symlinked-directories (Off)
On に設定すると、ディレクトリへのシンボリック リンクである完全な名前にスラッシュが追加されます (mark-directories の値に従います)。
match-hidden-files (On)
この変数を On に設定すると、readline は名前が「.」で始まるファイルと一致します。 (隠しファイル) ファイル名の補完を実行するとき、先頭の `.' を除いて 完了するファイル名でユーザーが指定します。
output-meta (Off)
On に設定すると、readline は、メタ接頭辞付きのエスケープ シーケンスとしてではなく、8 番目のビットが直接設定された文字を表示します。
page-completions (On)
On に設定すると、readline は内部のより似たページャーを使用して、可能な補完を一度に 1 画面いっぱい表示します。
print-completions-horizontally (Off)
On に設定されている場合、readline は、画面の下ではなく、アルファベット順に水平方向に並べ替えられた一致で補完を表示します。
show-all-if-ambiguous (Off)
これにより、補完関数のデフォルトの動作が変更されます。 on に設定されている場合、複数の可能な補完を持つ単語は、ベルを鳴らす代わりに、一致をすぐにリストします。
show-all-if-unmodified (Off)
これは、show-all-if-ambiguous と同様の方法で、補完関数のデフォルトの動作を変更します。 on に設定すると、部分補完の可能性のない複数の補完候補を持つ単語 (補完候補は共通の接頭辞を共有しません) は、ベルを鳴らす代わりに、一致する単語がすぐにリストされます。
visible-stats (Off)
On に設定すると、可能な補完をリストするときに、stat(2) によって報告されるファイルのタイプを示す文字がファイル名に追加されます。

Readline 条件付き構文 (Readline Conditional Constructs)

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 の現在または前の単語を引用するキー シーケンスを追加します。
$if Bash
# 現在または前の単語を引用する
"\C-xq": "\eb\"\ef\""
$endif
$endif
このコマンドは、前の例で見たように、$if コマンドを終了します。
$else
$if ディレクティブのこのブランチのコマンドは、テストが失敗した場合に実行されます。
$include
このディレクティブは、単一のファイル名を引数として取り、そのファイルからコマンドとバインディングを読み取ります。 たとえば、次のディレクティブは /etc/inputrc を読み取ります。

$include /etc/inputrc

検索 (Searching)

readline は、コマンド履歴 (HISTORY を参照) を検索して、指定された文字列を含む行を検索するためのコマンドを提供します。 インクリメンタルと非インクリメンタルの 2 つの検索モードがあります。

インクリメンタル検索は、ユーザーが検索文字列の入力を完了する前に開始されます。 検索文字列の各文字が入力されると、readline はそれまでに入力された文字列に一致する履歴から次のエントリを表示します。 インクリメンタル検索では、目的の履歴エントリを見つけるために必要な文字数だけが必要です。 isearch-terminators 変数の値に含まれる文字は、インクリメンタル検索を終了するために使用されます。 その変数に値が割り当てられていない場合、Escape および Control-J 文字はインクリメンタル検索を終了します。 Control-G はインクリメンタル検索を中止し、元の行を復元します。 検索が終了すると、検索文字列を含む履歴エントリが現在の行になります。

履歴リストで一致する他のエントリを見つけるには、必要に応じて Control-S または Control-R を入力します。 これにより、これまでに入力した検索文字列に一致する次のエントリを履歴で後方または前方に検索します。 readline コマンドにバインドされたその他のキー シーケンスは、検索を終了し、そのコマンドを実行します。 たとえば、改行は検索を終了して行を受け入れ、それによって履歴リストからコマンドを実行します。

readline は最後のインクリメンタル検索文字列を覚えています。 新しい検索文字列を定義する文字を挟まずに 2 つの Control-R を入力すると、記憶されている検索文字列が使用されます。

非インクリメンタル検索は、一致する履歴行の検索を開始する前に、検索文字列全体を読み取ります。 検索文字列は、ユーザーが入力するか、現在の行の内容の一部である場合があります。

Readline コマンド名 (Readline Command Names)

以下は、コマンドの名前とそれらがバインドされている既定のキー シーケンスの一覧です。 キー シーケンスを伴わないコマンド名は、既定ではバインドされていません。 以下の説明では、point は現在のカーソル位置を指し、mark は set-mark コマンドによって保存されたカーソル位置を指します。 point と mark の間のテキストはリージョンと呼ばれます。

移動コマンド (Commands for Moving)

beginning-of-line (C-a)
現在の行の先頭に移動します。
end-of-line (C-e)
行末に移動します。
forward-char (C-f)
キャラクターを前方に移動します。
backward-char (C-b)
文字を後ろに移動します。
forward-word (M-f)
次の単語の終わりに進みます。 単語は、英数字 (文字と数字) で構成されます。
backward-word (M-b)
現在または前の単語の先頭に戻ります。 単語は英数字 (文字と数字) で構成されます。
clear-screen (C-l)
現在の行を画面の上部に残して画面をクリアします。 引数を指定すると、画面をクリアせずに現在の行を更新します。
redraw-current-line
現在の行を更新します。

履歴を操作するコマンド (Commands for Manipulating the History)

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
履歴を前方に検索して、現在の行の開始点と point の間の文字列を探します。 これは非インクリメンタル検索です。
history-search-backward
履歴を逆方向に検索して、現在の行の開始点と point の間の文字列を探します。 これは非インクリメンタル検索です。
yank-nth-arg (M-C-y)
前のコマンドの最初の引数 (通常は前の行の 2 番目の単語) を point に挿入します。 引数 n を指定すると、前のコマンドの n 番目の単語が挿入されます (前のコマンドの単語は単語 0 で始まります)。 負の引数は、前のコマンドの終わりから n 番目の単語を挿入します。 引数 n が計算されると、"!n" 履歴展開が指定されたかのように引数が抽出されます。
yank-last-arg (M-., M-_)
前のコマンド (前の履歴エントリの最後の単語) に最後の引数を挿入します。 引数を指定すると、yank-nth-arg とまったく同じように動作します。 yank-last-arg を連続して呼び出すと、履歴リストをさかのぼり、各行の最後の引数が順番に挿入されます。 履歴展開機能は、"!$" 履歴展開が指定されたかのように、最後の引数を抽出するために使用されます。
shell-expand-line (M-C-e)
シェルと同じようにラインを展開します。 これにより、エイリアスと履歴の展開、およびすべてのシェル ワードの展開が実行されます。 履歴展開の説明については、以下の HISTORY EXPANSION を参照してください。
history-expand-line (M-^)
現在の行で履歴展開を実行します。 履歴展開の説明については、以下の HISTORY EXPANSION を参照してください。
magic-space
現在の行で履歴展開を実行し、スペースを挿入します。 履歴展開の説明については、以下の HISTORY EXPANSION を参照してください。
alias-expand-line
現在の行でエイリアス展開を実行します。 エイリアス展開の説明については、上記の ALIASES を参照してください。
history-and-alias-expand-line
現在の行で履歴とエイリアスの展開を実行します。
insert-last-argument (M-., M-_)
yank-last-arg と同義。
operate-and-get-next (C-o)
実行のために現在の行を受け入れ、編集のために履歴から現在の行に関連する次の行を取得します。 引数は無視されます。
edit-and-execute-command (C-xC-e)
現在のコマンド ラインでエディターを呼び出し、結果をシェル コマンドとして実行します。 Bash は、$FCEDIT、$EDITOR、および emacs をエディタとしてこの順序で起動しようとします。

テキストを変更するコマンド (Commands for Changing Text)

delete-char (C-d)
point の文字を削除します。 point が行の先頭にあり、行に文字がなく、最後に入力された文字が delete-char にバインドされていない場合は、EOF を返します。
backward-delete-char (Rubout)
カーソルの後ろの文字を削除します。 数値引数を指定すると、削除されたテキストを kill リングに保存します。
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)
point の前の文字を point の文字の上に前方にドラッグし、 point も前方に移動します。 point が行末にある場合、これは point の前の 2 文字を置き換えます。 負の引数は効果がありません。
transpose-words (M-t)
point の前の単語を point の次の単語を越えてドラッグし、 point をその単語の上にも移動します。 point が行末にある場合、これは行の最後の 2 つの単語を転置します。
upcase-word (M-u)
現在の (または次の) 単語を大文字にします。 負の引数を指定すると、前の単語を大文字にしますが、 point は移動しません。
downcase-word (M-l)
現在の (または次の) 単語を小文字にします。 負の引数を指定すると、前の単語を小文字にしますが、 point は移動しません。
capitalize-word (M-c)
現在の (または次の) 単語を大文字にします。 負の引数を指定すると、前の単語を大文字にしますが、 point は移動しません。
overwrite-mode
上書きモードを切り替えます。 明示的な正の数値引数を指定すると、上書きモードに切り替わります。 正でない数値引数を明示的に指定すると、挿入モードに切り替わります。 このコマンドは emacs モードにのみ影響します。 vi モードでは上書きが異なります。 readline() への各呼び出しは、挿入モードで開始されます。 上書きモードでは、自己挿入にバインドされた文字は、テキストを右に押すのではなく、 point でテキストを置き換えます。 Backward-delete-char にバインドされた文字は、 point の前の文字をスペースに置き換えます。 デフォルトでは、このコマンドはバインドされていません。

Killing and Yanking

kill-line (C-k)
point から行末までのテキストを削除します。
backward-kill-line (C-x Rubout)
行頭までさかのぼってキルします。
unix-line-discard (C-u)
point から行頭まで後方に kill します。 キルされたテキストはキルリングに保存されます。
kill-whole-line
point がどこにあるかに関係なく、現在の行のすべての文字を削除します。
kill-word (M-d)
point から現在の単語の終わりまで、または単語と単語の間の場合は次の単語の終わりまでを削除します。 単語境界は、forward-word で使用されるものと同じです。
backward-kill-word (M-Rubout)
point の後ろの単語を殺します。 単語境界は、backward-word で使用されるものと同じです。
unix-word-rubout (C-w)
空白を単語境界として使用して、 point の後ろの単語を削除します。 キルされたテキストはキルリングに保存されます。
unix-filename-rubout
空白とスラッシュ文字を単語の境界として使用して、 point の後ろの単語を削除します。 キルされたテキストはキルリングに保存されます。
delete-horizontal-space (M-\)
point の周りのすべてのスペースとタブを削除します。
kill-region
現在のリージョンのテキストを削除します。
copy-region-as-kill
リージョン内のテキストをキル バッファにコピーします。
copy-backward-word
point の前の単語をキル バッファにコピーします。 単語境界は、backward-word と同じです。
copy-forward-word
point に続く単語をキルバッファにコピーします。 ワード境界は forward-word と同じです。
yank (C-y)
point でキルリングの上部をバッファーにヤンクします。
yank-pop (M-y)
キルリングを回転させ、新しいトップを引っ張ってください。 yank または yank-pop の後にのみ機能します。

数値引数 (Numeric Arguments)

digit-argument (M-0, M-1, ..., M--)
この桁をすでに蓄積している引数に追加するか、新しい引数を開始します。 M-- 負の引数を開始します。
universal-argument
これは、引数を指定する別の方法です。 このコマンドの後に 1 つ以上の数字が続き、必要に応じて先頭にマイナス記号を付けると、それらの数字が引数を定義します。 コマンドの後に数字が続く場合、universal-argument を再度実行すると数値引数が終了しますが、それ以外の場合は無視されます。 特殊なケースとして、このコマンドの直後に数字でもマイナス記号でもない文字が続く場合、次のコマンドの引数カウントは 4 倍になります。 引数の数は最初は 1 であるため、この関数を最初に実行すると引数の数は 4 になり、2 回目は引数の数が 16 になります。

補完 (Completing)

complete (TAB)
point の前のテキストで補完を試みます。 bash は、テキストを変数 (テキストが $ で始まる場合)、ユーザー名 (テキストが ~ で始まる場合)、ホスト名 (テキストが @ で始まる場合)、またはコマンド (エイリアスと関数を含む) として順番に処理して補完を試みます。 これらのいずれも一致しない場合、ファイル名の補完が試みられます。
possible-completions (M-?)
point の前のテキストの可能な補完をリストします。
insert-completions (M-*)
可能な補完によって生成されたであろう point の前に、テキストのすべての補完を挿入します。
menu-complete
complete に似ていますが、補完される単語を可能な補完のリストからの 1 つの一致に置き換えます。 各一致を順番に挿入して、可能な補完のリストを介してメニュー補完ステップを繰り返し実行します。 補完リストの最後で、ベルが鳴り (bell-style の設定に従う)、元のテキストが復元されます。 引数 n を指定すると、一致リスト内で n 位置が前方に移動します。 負の引数を使用して、リストを逆方向に移動できます。 このコマンドは TAB にバインドされることを意図していますが、デフォルトではバインドされていません。
delete-char-or-list
行頭または行末でない場合、カーソルの下の文字を削除します (delete-char と同様)。 行末の場合は、可能な補完と同じように動作します。 このコマンドは、デフォルトではバインドされていません。
complete-filename (M-/)
point の前のテキストでファイル名の補完を試みます。
possible-filename-completions (C-x /)
point の前のテキストの可能な補完をリストし、それをファイル名として扱います。
complete-username (M-~)
ユーザー名として扱い、 point の前のテキストの補完を試みます。
possible-username-completions (C-x ~)
point の前のテキストの可能な補完をリストし、それをユーザー名として扱います。
complete-variable (M-$)
point の前のテキストで補完を試み、それをシェル変数として扱います。
possible-variable-completions (C-x $)
point の前のテキストの可能な補完をリストし、それをシェル変数として扱います。
complete-hostname (M-@)
ホスト名として扱い、 point の前のテキストの補完を試みます。
possible-hostname-completions (C-x @)
ホスト名として扱い、 point の前のテキストの可能な補完をリストします。
complete-command (M-!)
コマンド名として扱い、 point の前のテキストの補完を試みます。 コマンド補完は、テキストをエイリアス、予約語、シェル関数、シェル組み込み、最後に実行可能なファイル名の順に照合しようとします。
possible-command-completions (C-x !)
コマンド名として扱い、 point の前のテキストの可能な補完をリストします。
dynamic-complete-history (M-TAB)
point の前のテキストで補完を試み、テキストを履歴リストの行と比較して、補完の一致の可能性を探します。
complete-into-braces (M-{)
ファイル名の補完を実行し、可能な補完のリストを中かっこで囲んで挿入し、そのリストをシェルで使用できるようにします (上記の中かっこの展開を参照してください)。

キーボードマクロ (Keyboard Macros)

start-kbd-macro (C-x ()
現在のキーボード マクロに入力された文字の保存を開始します。
end-kbd-macro (C-x ))
現在のキーボード マクロに入力された文字の保存を停止し、定義を保存します。
call-last-kbd-macro (C-x e)
定義された最後のキーボード マクロを再実行し、マクロ内の文字をキーボードで入力したように表示します。

その他 (Miscellaneous)

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)
次に入力した文字を Metafy します。 ESC f は Meta-f と同等です。
undo (C-_, C-x C-u)
行ごとに個別に記憶される段階的な元に戻す。
revert-line (M-r)
この行に加えられたすべての変更を元に戻します。 これは、行を初期状態に戻すのに十分な回数、元に戻すコマンドを実行するようなものです。
tilde-expand (M-&)
現在の単語に対してチルダ展開を実行します。
set-mark (C-@, M-)
マークを point に設定します。 数値引数が指定された場合、マークはその位置に設定されます。
exchange-point-and-mark (C-x C-x)
マークと point を入れ替えます。 現在のカーソル位置が保存された位置に設定され、古いカーソル位置がマークとして保存されます。
character-search (C-])
文字が読み取られ、その文字の次の出現箇所に point が移動します。 負のカウントは、以前のオカレンスを検索します。
character-search-backward (M-C-])
文字が読み取られ、 point がその文字の前のオカレンスに移動します。 負のカウントは、後続のオカレンスを検索します。
insert-comment (M-#)
数値引数がない場合、readline コメント開始変数の値が現在の行の先頭に挿入されます。 数値引数が指定されている場合、このコマンドはトグルとして機能します。行頭の文字が comment-begin の値と一致しない場合、値が挿入されます。そうでない場合、comment-begin の文字は先頭から削除されます。 行の。 どちらの場合でも、行は改行が入力されたかのように受け入れられます。 comment-begin のデフォルト値により、このコマンドは現在の行をシェル コメントにします。 数値引数によってコメント文字が削除される場合、その行はシェルによって実行されます。
glob-complete-word (M-g)
point の前の単語は、パス名展開のパターンとして扱われ、暗黙的にアスタリスクが追加されます。 このパターンは、可能な補完のために一致するファイル名のリストを生成するために使用されます。
glob-expand-word (C-x *)
point の前の単語はパス名展開のパターンとして扱われ、一致するファイル名のリストが挿入され、単語が置き換えられます。 数値引数を指定すると、パス名展開の前にアスタリスクが追加されます。
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 の現在のインスタンスに関するバージョン情報を表示します。

プログラム可能な補完 (Programmable Completion)

補完仕様 (compspec) が組み込みコマンド complete を使用して定義されているコマンドの引数に対して単語補完が試行されると、プログラム可能な補完機能が呼び出されます。

まず、コマンド名が識別されます。 そのコマンドに対して compspec が定義されている場合、その compspec を使用して、単語の可能な補完候補のリストが生成されます。 コマンド ワードがフル パス名の場合、フル パス名の compspec が最初に検索されます。 フル パス名の compspec が見つからない場合は、最後のスラッシュに続く部分の compspec を見つけようとします。

compspec が見つかると、一致する単語のリストを生成するために使用されます。 compspec が見つからない場合、上記の Completing で説明したデフォルトの bash 完了が実行されます。

まず、compspec で指定されたアクションが使用されます。 補完される単語が前に付いている一致のみが返されます。 ファイル名またはディレクトリ名の補完に -f または -d オプションを使用すると、シェル変数 FIGNORE を使用して一致がフィルタリングされます。

ファイル名展開パターンで -G オプションに指定された補完が次に生成されます。 パターンによって生成された単語は、補完される単語と一致する必要はありません。 GLOBIGNORE シェル変数は、一致をフィルタリングするために使用されませんが、FIGNORE 変数が使用されます。

次に、-W オプションの引数として指定された文字列が考慮されます。 文字列は、最初に IFS 特殊変数の文字を区切り文字として使用して分割されます。 シェルの引用は尊重されます。 次に、上記の EXPANSION で説明したように、ブレース展開、チルダ展開、パラメーターと変数の展開、コマンド置換、および算術展開を使用して、各単語が展開されます。 結果は、Word Splitting で説明したルールを使用して分割されます。 展開の結果は、補完される単語に対してプレフィックス マッチングされ、一致する単語が可能な補完になります。

これらの一致が生成された後、-F および -C オプションで指定されたシェル関数またはコマンドが呼び出されます。 コマンドまたは関数が呼び出されると、前述のシェル変数で説明したように、COMP_LINE および COMP_POINT 変数に値が割り当てられます。 シェル関数が呼び出されている場合、COMP_WORDS および COMP_CWORD 変数も設定されます。 関数またはコマンドが呼び出されると、最初の引数は引数が補完されるコマンドの名前、2 番目の引数は補完される単語、3 番目の引数は現在のコマンド ラインで補完される単語の前の単語です。 補完される単語に対する生成された補完のフィルタリングは実行されません。 関数またはコマンドには、一致を生成する完全な自由があります。

-F で指定された関数が最初に呼び出されます。 この関数は、以下で説明する組み込みコマンド compgen を含む任意のシェル機能を使用して、一致を生成できます。 可能な補完を COMPREPLY 配列変数に入れる必要があります。

次に、-C オプションで指定された任意のコマンドが、コマンド置換と同等の環境で呼び出されます。 補完のリストを 1 行に 1 つずつ標準出力に出力する必要があります。 必要に応じて、バックスラッシュを使用して改行をエスケープできます。

可能なすべての補完が生成された後、-X オプションで指定されたフィルターがリストに適用されます。 フィルターは、パス名の展開に使用されるパターンです。 パターン内の & は、補完される単語のテキストに置き換えられます。 リテラル & はバックスラッシュでエスケープできます。 一致を試みる前にバックスラッシュが削除されます。 パターンに一致する補完はリストから削除されます。 リーディング! パターンを否定します。 この場合、パターンに一致しない補完はすべて削除されます。

最後に、-P オプションと -S オプションで指定された接頭辞と接尾辞が補完リストの各メンバーに追加され、結果が可能な補完のリストとして readline 補完コードに返されます。

以前に適用されたアクションが一致するものを生成せず、compspec が定義されたときに完了するために -o dirnames オプションが指定された場合、ディレクトリ名の補完が試行されます。

compspec が定義されたときに完了のために -o plusdirs オプションが指定された場合、ディレクトリー名の完了が試行され、一致するものがあれば他のアクションの結果に追加されます。

デフォルトでは、compspec が見つかった場合、それが生成するものはすべて、可能な補完の完全なセットとして補完コードに返されます。 デフォルトの bash 補完は試行されず、readline のデフォルトのファイル名補完は無効になっています。 compspec が定義されたときに完了するために -o bashdefault オプションが指定された場合、compspec が一致を生成しない場合は、bash のデフォルトの補完が試行されます。 compspec が定義されたときに complete に -o default オプションが指定された場合、compspec (および試みられた場合はデフォルトの bash 補完) が一致を生成しない場合、readline のデフォルトの補完が実行されます。

compspec がディレクトリ名の補完が必要であることを示している場合、プログラム可能な補完関数は、readline 変数 mark-symlinked-directories の設定に関係なく、readline 変数 mark-directories の値に従って、ディレクトリへのシンボリック リンクである補完済みの名前にスラッシュを強制的に追加します。

履歴 (HISTORY)

組み込みコマンド set の -o history オプションが有効な場合、シェルはコマンド履歴 (以前に入力したコマンドのリスト) へのアクセスを提供します。 HISTSIZE 変数の値は、履歴リストに保存するコマンドの数として使用されます。 最後の HISTSIZE コマンドのテキスト (デフォルトは 500) が保存されます。 シェルは、シェル変数 HISTIGNORE および HISTCONTROL の値に従って、各コマンドをパラメータおよび変数の展開 (上記の EXPANSION を参照) の前に履歴リストに保存しますが、履歴の展開が実行された後です。

起動時に、履歴は変数 HISTFILE (デフォルト ~/.bash_history) で指定されたファイルから初期化されます。 HISTFILE の値で指定されたファイルは、HISTFILESIZE の値で指定された行数以下になるように、必要に応じて切り捨てられます。 対話型シェルが終了すると、最後の $HISTSIZE 行が履歴リストから $HISTFILE にコピーされます。 histappend シェル オプションが有効になっている場合 (組み込みコマンド shopt の説明を参照)、行が履歴ファイルに追加されます。そうでない場合、履歴ファイルは上書きされます。 HISTFILE が設定されていない場合、または履歴ファイルが書き込み不可の場合、履歴は保存されません。 履歴を保存した後、履歴ファイルは HISTFILESIZE 行を超えないように切り捨てられます。 HISTFILESIZE が設定されていない場合、切り捨ては実行されません。

組み込みコマンド fc (BUITIN COMMANDSを参照) を使用して、履歴リストの一部を一覧表示または編集し、再実行することができます。組み込みコマンド history を使用して、履歴リストを表示または変更し、履歴ファイルを操作できます。 コマンドライン編集を使用する場合、履歴リストへのアクセスを提供する各編集モードで検索コマンドを使用できます。

シェルでは、履歴リストに保存されるコマンドを制御できます。 HISTCONTROL 変数と HISTIGNORE 変数を設定すると、入力されたコマンドのサブセットのみをシェルに保存させることができます。 cmdhist シェル オプションを有効にすると、シェルは複数行のコマンドの各行を同じ履歴エントリに保存しようとし、構文の正確さを維持するために必要な場所にセミコロンを追加します。 lithist シェル オプションを使用すると、シェルはセミコロンの代わりに改行を埋め込んでコマンドを保存します。 シェル オプションの設定と設定解除の詳細については、組み込みコマンド shopt の説明を参照。

履歴展開 (HISTORY EXPANSION)

シェルは、csh の履歴展開に似た履歴展開機能をサポートしています。 このセクションでは、使用可能な構文機能について説明します。 この機能は、対話型シェルではデフォルトで有効になっており、set 組み込みコマンドの +H オプションを使用して無効にすることができます (BUILTIN COMMANDSを参照)。 非対話型シェルは、デフォルトでは履歴展開を実行しません。

履歴展開は、履歴リストから入力ストリームに単語を導入し、コマンドを繰り返したり、前のコマンドの引数を現在の入力行に挿入したり、前のコマンドのエラーをすばやく修正したりすることを容易にします。

履歴展開は、シェルが行を単語に分割する前に、行全体が読み取られた直後に実行されます。 それは2つの部分で行われます。 1 つ目は、置換中に使用する履歴リストの行を決定することです。 2 つ目は、現在の行に含める行の一部を選択することです。 履歴から選択された行がイベントであり、その行の実行された部分が単語です。 選択した単語を操作するために、さまざまな修飾子を使用できます。 行は、入力を読み取るときと同じ方法で単語に分割されるため、引用符で囲まれたいくつかのメタ文字で区切られた単語は 1 つの単語と見なされます。 履歴展開は、履歴展開文字(デフォルトは ! )の登場によって導入されます。バックスラッシュ () と単一引用符のみが履歴展開文字を引用できます。

スペース、タブ、改行、キャリッジ リターン、= などのいくつかの文字は、引用符で囲まれていない場合でも、履歴展開文字の直後に見つかった場合、履歴展開を禁止します。 extglob シェル オプションが有効な場合、( も展開を禁止します。

組み込みの shopt で設定可能ないくつかのシェル オプションを使用して、履歴展開の動作を調整できます。 histverify シェル オプションが有効になっており (組み込みコマンド shopt の説明を参照)、readline が使用されている場合、履歴置換はシェル パーサーにすぐには渡されません。 代わりに、展開された行は、さらに変更するために readline 編集バッファーに再ロードされます。 readline が使用されていて、histreedit シェル オプションが有効になっている場合、失敗した履歴置換は、修正のために readline 編集バッファーに再ロードされます。 history 組み込みコマンドの -p オプションを使用すると、使用前に履歴展開が何を行うかを確認できます。組み込みコマンド history の -s オプションを使用すると、コマンドを実際に実行せずに履歴リストの最後に追加して、後で再呼び出しできるようにすることができます。

シェルでは、履歴展開メカニズムで使用されるさまざまな文字を制御できます (シェル変数 histchars の説明を参照)。

イベント指定子 (Event Designators)

イベント指定子は、履歴リスト内のコマンド ライン エントリへの参照です。

!
空白、改行、キャリッジリターン、= または ( (組み込みの shopt を使用して extglob シェル オプションが有効になっている場合) が続く場合を除き、履歴置換を開始します。
!n
コマンドライン n を参照。
!-n
現在のコマンドラインから n を引いたものを参照します。
!!
直前のコマンドを参照。 これは `!-1' と同義です。
!string
string で始まる直近のコマンドを参照。
!?string[?]
string を含む最新のコマンドを参照。 末尾の ? はstring の直後に改行がある場合は省略できます。
^string1^string2^
クイック置換。直前のコマンドの string1 を string2 に置き換えて再実行します。 !!:s/string1/string2/ と同等です (Modifiers の説明を参照)。
!#
これまでに入力したコマンドライン全体。

単語指定子 (Word Designators)

単語指定子は、イベントから目的の単語を選択するために使用されます。 イベント指定と単語指定子の間を : で区切ります。 単語指定子が ^、$、*、-、または % で始まる場合、( : を)省略できます。 単語は行の先頭から番号が付けられ、最初の単語は 0 (ゼロ) で示されます。 単語は、単一のスペースで区切られて現在の行に挿入されます。

単語指定子のリストと例を示す。 仮に履歴の501番目のコマンドを以下とする。

501  echo ab cd ef gh ij
0 (zero)
ゼロ番目の単語。 多くのアプリケーションの場合、これはコマンドを示す単語です。
例.!501:0echo
n
n 番目の単語。
例.!501:2cd
^
最初の引数。 つまり、単語 1 です。
例.!501:^ab
$
最後の引数。
例.!501:$ij
%
直近の `?string?' 検索でマッチした単語。
例.!:%ef (事前に !?f? で検索しているものとする)
x-y
単語の範囲。 `-y' は `0-y' を省略します。
例1.!501:2-4cd ef gh
例2.!501:-4echo ab cd ef gh
*
0 番目を除くすべての単語。 これは `1-$' と同義です。 イベントに単語が 1 つしかない場合に * を使用してもエラーにはなりません。 その場合、空の文字列が返されます。
例.!501:*ab cd ef gh ij
x*
x-$ を省略します。
例.!501:4*gh ij
x-
x* のように x-$ を省略しますが、最後の単語は省略します。
例.!501:4-gh

イベント指定なしで単語指定子を指定すると、直前のコマンドがイベントとして使用されます。

修飾子 (Modifiers)

オプションの単語指定子の後に、: で始まる以下の修飾子を1個以上連続して追加することができます。 これらは、履歴イベントから選択された単語を修正、編集します。

修飾子のリストと例を示す。 仮に履歴の525番目のコマンドを以下とする。

525  sed 's@71 72@81 82@' /home/userA/temp1.txt /home/userB/temp2.lst
h
末尾のファイル名コンポーネントを削除し、先頭のみを残します。
例.!525:2:h/home/userA
t
先頭のファイル名コンポーネントをすべて削除し、末尾を残します。
例.!525:2:ttemp1.txt
r
.xxx 形式の末尾のサフィックスを削除し、ベース名を残します。
例.!525:2:r/home/userA/temp1
e
末尾の接尾辞以外をすべて削除します。
例.!525:2:e.txt
p
新しいコマンドを表示しますが、実行はしません。
例.!525:psed 's@71 72@81 82@' /home/userA/temp1.txt /home/userB/temp2.lst
q
置換された単語を引用符で囲み、それ以上の置換を回避します。
例.!525:0-2:q'sed '\''s@71 72@81 82@'\'' /home/userA/temp1.txt'
x
q と同様に置換された単語を引用符で囲みますが、空白、タブ、改行で単語に分割します。 q 修飾子と x 修飾子は相互に排他的です。 最後に提供されたものが使用されます。
例.!525:0-2:x'sed' ''\''s@71' '72@81' '82@'\''' '/home/userA/temp1.txt'
s/old/new/
イベント行で最初に出現する old を new に置き換えます。 / の代わりに任意の区切り文字を使用できます。 old や new の中で区切り文字を使う場合は、バックスラッシュでエスケープします。 & が new にある場合、 old に置き換えられます。 単一のバックスラッシュは & を引用します。 old が null の場合は、直近の履歴置換実行時の old が設定されます。 ただし過去に履歴置換が行われていない場合は、直近の !?string[?] 検索の string に設定されます。 new が null の場合、一致する old はそれぞれ削除されます。最後の区切り文字が入力行の最後の文字である場合、最後の区切り文字はオプションです。
例.!525:s/2/9sed 's@71 79@81 82@' /home/userA/temp1.txt /home/userB/temp2.lst
&
直前の置換を繰り返します。
例.!!:&sed 's@71 79@81 89@' /home/userA/temp1.txt /home/userB/temp2.lst
g または a
イベント行全体に変更を適用します。 これは、':s' (例: ':gs/old/new/') または ':&' と組み合わせて使用されます。 ':s' と共に使用する場合、/ の代わりに任意の区切り文字を使用できます。最後の区切り文字がイベント行の最後の文字である場合、最後の区切り文字はオプションです。
例.!525:gs/2/9sed 's@71 79@81 89@' /home/userA/temp1.txt /home/userB/temp9.lst
G
イベント行の各単語に次の 's' または '&' 修飾子を 1 回適用します。
例.!525:Gs/2/9sed 's@71 79@81 82@' /home/userA/temp1.txt /home/userB/temp9.lst

組み込みコマンド (BUILTIN COMMANDS)

特に明記されていない限り、このセクションで説明されている各組み込みコマンドは、オプションの末尾に - が付いているオプションを受け入れるものとして説明されており、オプションの終わりを示すために -- を受け入れます。 たとえば、:、true、false、および組み込みコマンド test はオプションを受け入れません。

: [arguments]
無効; このコマンドは、argumentsを展開し、指定されたリダイレクトを実行する以外には何もしません。 ゼロの終了コードが返されます。
. filename [arguments]
source filename [arguments]
現在のシェル環境で filename からコマンドを読み取って実行し、filename から最後に実行されたコマンドの終了ステータスを返します。 filename にスラッシュが含まれていない場合、PATH 内のファイル名を使用して filename を含むディレクトリを検索します。 PATH で検索されるファイルは、実行可能ファイルである必要はありません。 bash が posix モードでない場合、PATH にファイルが見つからない場合、現在のディレクトリが検索されます。 shopt 組み込みコマンドの sourcepath オプションがオフになっている場合、PATH は検索されません。 arguments が指定されている場合、それらは filename が実行されたときに位置パラメータになります。 それ以外の場合、位置パラメータは変更されません。 戻りステータスは、スクリプト内で最後に終了したコマンドのステータス (コマンドが実行されていない場合は 0) であり、ファイル名が見つからないか読み取れない場合は false です。
alias [-p] [name[=value] ...]
引数なしのalias、または -p オプションを指定したaliasは、エイリアスのリストをalias name=value の形式で標準出力に出力します。 引数を指定すると、valueが指定されたnameごとにエイリアスが定義されます。 valueに末尾のスペースがあると、エイリアスが展開されたときに、次の単語のエイリアス置換がチェックされます。 valueが指定されていない引数リスト内のnameごとに、エイリアスの名前と値が出力されます。 alias は、エイリアスが定義されていないnameが指定されていない限り、true を返します。
bg [jobspec ...]
& で開始されたかのように、中断された各ジョブ jobspec をバックグラウンドで再開します。 jobspec が存在しない場合、現在のジョブのシェルの概念が使用されます。 bg jobspec は、ジョブ制御が無効なときに実行されるか、ジョブ制御が有効な状態で実行されるときに、指定された jobspec が見つからないか、ジョブ制御なしで開始された場合を除き、0 を返します。
bind [-m keymap] [-lpsvPSV]
bind [-m keymap] [-q function] [-u function] [-r keyseq]
bind [-m keymap] -f filename
bind [-m keymap] -x keyseq:shell-command
bind [-m keymap] keyseq:function-name
bind readline-command
現在の readline キーと関数バインディングを表示するか、キー シーケンスを readline 関数またはマクロにバインドするか、readline 変数を設定します。 オプション以外の各引数は、.inputrc に表示されるコマンドですが、各バインドまたはコマンドは個別の引数として渡す必要があります。 例: '"\C-x\C-r": re-read-init-file'. オプションが指定されている場合、次の意味があります。
-m keymap
後続のバインディングの影響を受けるキーマップとして keymap を使用します。 受け入れ可能なkeymap名は、emacs、emacs-standard、emacs-meta、emacs-ctlx、vi、vi-move、vi-command、および vi-insert です。 vi は vi コマンドと同等です。 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 の現在のバインドをすべて削除します。
-x keyseq:shell-command
keyseq が入力されるたびに shell-command が実行されるようにします。
認識されないオプションが指定された場合やエラーが発生した場合を除き、戻り値は 0 です。
break [n]
for、while、until、または select ループ内から抜けます。 n を指定すると、n レベルにブレークします。 n は 1 以上でなければなりません。n が囲んでいるループの数より大きい場合、囲んでいるすべてのループが終了します。 break の実行時にシェルがループを実行していない場合を除き、戻り値は 0 です。
builtin shell-builtin [arguments]
指定されたshell-builtinを実行し、argumentsを渡し、終了ステータスを返します。 これは、組み込みコマンドと同じ名前の関数を定義し、関数内で組み込みコマンドの機能を保持する場合に便利です。組み込みコマンド cd は、通常、このように再定義されます。 shell-builtin がシェル組み込みコマンドでない場合、戻りステータスは false です。
cd [-L|-P] [dir]
現在のディレクトリを dir に変更します。 変数 HOME はデフォルトのdirです。 変数 CDPATH は、dir を含むディレクトリの検索パスを定義します。 CDPATH の代替ディレクトリ名は、コロン (:) で区切られています。 CDPATH 内のヌル ディレクトリ名は、現在のディレクトリと同じ、つまり ``.'' です。 dir がスラッシュ (/) で始まる場合、CDPATH は使用されません。 -P オプションは、シンボリック リンクをたどる代わりに物理ディレクトリ構造を使用するように指定します (set 組み込みコマンドの -P オプションも参照)。 -L オプションは、シンボリック リンクをたどることを強制します。 - の引数は、$OLDPWD と同等です。 CDPATH からの空でないディレクトリ名が使用された場合、または - が最初の引数であり、ディレクトリの変更が成功した場合、新しい作業ディレクトリの絶対パス名が標準出力に書き込まれます。 ディレクトリが正常に変更された場合、戻り値は true です。 それ以外の場合は false。
caller [expr]
アクティブなサブルーチン呼び出し (. または組み込みコマンド source で実行されるシェル関数またはスクリプト) のコンテキストを返します。expr を指定しない場合、caller は現在のサブルーチン呼び出しの行番号とソース ファイル名を表示します。非負の整数が expr として指定されている場合 , caller は, 現在の実行コールスタックのその位置に対応する行番号, サブルーチン名, ソースファイルを表示します. この追加情報は, 例えば, スタックトレースを出力するために使用されます. 現在のフレームはフレーム 0 です. 戻り値 シェルがサブルーチン呼び出しを実行していないか、expr が呼び出しスタック内の有効な位置に対応していない限り、0 です。
command [-pVv] command [arg ...]
通常のシェル関数のルックアップを抑制するargを指定してcommandを実行します。 組み込みコマンドまたは PATH にあるコマンドのみが実行されます。 -p オプションが指定されている場合、コマンドの検索は、すべての標準ユーティリティを検出することが保証されている PATH のデフォルト値を使用して実行されます。 -V または -v オプションを指定すると、commandの説明が出力されます。 -v オプションを指定すると、commandの呼び出しに使用されたコマンドまたはファイル名を示す単一の単語が表示されます。 -V オプションは、より詳細な説明を生成します。 -V または -v オプションが指定されている場合、commandが見つかった場合は終了ステータスが 0 になり、見つからなかった場合は 1 になります。 どちらのオプションも指定されず、エラーが発生したか、commandが見つからない場合、終了ステータスは 127 です。それ以外の場合、組み込みコマンドの終了ステータスは command の終了ステータスになります。
compgen [option] [word]
-p と -r を除く組み込みコマンド で受け入れられる任意のオプションであるoptionに従って、単語の可能な補完一致を生成し、一致を標準出力に書き込みます。 -F または -C オプションを使用する場合、プログラマブル補完機能によって設定されるさまざまなシェル変数は、使用可能ではありますが、有用な値を持ちません。

一致は、プログラム可能な完了コードが同じフラグを持つ完了指定から直接生成した場合と同じ方法で生成されます。 word が指定されている場合、wordに一致する補完のみが表示されます。

無効なオプションが指定された場合、または一致が生成されなかった場合を除き、戻り値は true です。
complete [-abcdefgjksuv] [-o comp-option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] name [name ...]
complete -pr [name ...]
各nameへの引数を完了する方法を指定します。 -p オプションが指定されている場合、またはオプションが指定されていない場合は、入力として再利用できるように、既存の補完仕様が出力されます。 -r オプションは、各nameの補完仕様を削除します。nameが指定されていない場合は、すべての補完仕様を削除します。

単語補完が試行されたときにこれらの補完指定を適用するプロセスは、上記の「プログラム可能な補完」で説明されています。

その他のオプションが指定されている場合、次の意味があります。 -G、-W、および -X オプション (および、必要に応じて -P および -S オプション) への引数は、組み込みコマンド が呼び出される前に展開されないように保護するために引用符で囲む必要があります。
-o comp-option
comp-option は、補完の単純な生成を超えて、compspec の動作のいくつかの側面を制御します。 comp-option は次のいずれかです。
bashdefault
compspec が一致を生成しない場合は、残りのデフォルトの bash 補完を実行します。
default
compspec が一致を生成しない場合、readline のデフォルトのファイル名補完を使用します。
dirnames
compspec で一致が生成されない場合は、ディレクトリ名の補完を実行します。
filenames
compspec がファイル名を生成することを readline に伝えて、ファイル名固有の処理 (ディレクトリ名へのスラッシュの追加や末尾のスペースの抑制など) を実行できるようにします。 シェル関数で使用することを意図しています。
nospace
readline に、行末で完成した単語にスペース (デフォルト) を追加しないように指示します。
plusdirs
compspec によって定義された一致が生成された後、ディレクトリ名の補完が試行され、一致があれば他のアクションの結果に追加されます。
-A action
actionは、可能な補完のリストを生成するために、次のいずれかになります。
alias
エイリアス名。 -a として指定することもできます。
arrayvar
配列変数名。
binding Readline
キー バインディング名。
builtin
シェル組み込みコマンドの名前。 -b として指定することもできます。
command
コマンド名。 -c として指定することもできます。
directory
ディレクトリ名。 -d として指定することもできます。
disabled
無効化されたシェル組み込みの名前。
enabled
有効化されたシェル組み込みの名前。
export
エクスポートされたシェル変数の名前。 -e として指定することもできます。
file
ファイル名。 -f として指定することもできます。
function
シェル関数の名前。
group
グループ名。 -g として指定することもできます
helptopic
組み込みコマンド help によって受け入れられるヘルプ トピック。
hostname
HOSTFILE シェル変数で指定されたファイルから取得したホスト名。
job
ジョブ制御がアクティブな場合のジョブ名。 -j として指定することもできます。
keyword
シェルの予約語。 -k として指定することもできます。
running
ジョブ制御がアクティブな場合、実行中のジョブの名前。
service
サービス名。 -s として指定することもできます。
setopt
組み込みコマンド set の -o オプションの有効な引数。
shopt
組み込みの shopt によって受け入れられるシェル オプション名。
signal
シグナル名。
stopped
ジョブ制御がアクティブな場合、停止されたジョブの名前。
user
ユーザー名。 -u として指定することもできます。
variable
すべてのシェル変数の名前。 -v として指定することもできます。
-G globpat
ファイル名展開パターン globpat が展開され、可能な補完が生成されます。
-W wordlist
wordlistは、IFS 特殊変数内の文字を区切り文字として使用して分割され、結果の各単語が展開されます。 可能な補完は、補完される単語に一致する結果リストのメンバーです。
-C command
commandはサブシェル環境で実行され、その出力は可能な補完として使用されます。
-F function
シェル関数functionは、現在のシェル環境で実行されます。 完了すると、可能な補完が COMPREPLY 配列変数の値から取得されます。
-X filterpat
filterpat は、ファイル名の展開に使用されるパターンです。 前のオプションと引数によって生成される可能性のある補完のリストに適用され、filterpat に一致する各補完がリストから削除されます。 filterpat の先頭の ! はパターンを否定します。 この場合、filterpat に一致しない補完はすべて削除されます。
-P prefix
他のすべてのオプションが適用された後、可能な各補完の先頭にprefixが追加されます。
-S suffix
他のすべてのオプションが適用された後、可能な各補完にsuffixが追加されます。

無効なオプションが指定された場合、name 引数なしで -p または -r 以外のオプションが指定された場合、指定が存在しないnameの補完指定を削除しようとした場合、または補完指定の追加でエラーが発生した場合を除き、戻り値は true です。

continue [n]
for、while、until、または select ループの次の反復を再開します。 n を指定すると、n 番目の囲みループから再開します。 n は 1 以上でなければなりません。n が囲んでいるループの数より大きい場合、最後に囲んでいるループ (「トップレベル」のループ) が再開されます。 continue の実行時にシェルがループを実行していない場合を除き、戻り値は 0 です。
declare [-afFirtx] [-p] [name[=value] ...]
typeset [-afFirtx] [-p] [name[=value] ...]
変数を宣言し、属性を与えます。 nameが指定されていない場合は、変数の値を表示します。 -p オプションは、各nameの属性と値を表示します。 -p を使用すると、追加のオプションは無視されます。 -F オプションは、関数定義の表示を禁止します。 関数名と属性のみが出力されます。 shopt を使用して extdebug シェル オプションを有効にすると、関数が定義されているソース ファイル名と行番号も表示されます。 -F オプションは -f を意味します。 次のオプションを使用して、指定した属性を持つ変数への出力を制限したり、変数に属性を与えたりできます。
-a
それぞれのnameは配列変数です (上記の「配列」を参照)。
-f
関数名のみを使用します。
-i
変数は整数として扱われます。 算術評価は、変数に値が割り当てられるときに実行されます。
-r
nameを読み取り専用にします。 これらのnameは、後続の代入ステートメントで値を割り当てたり、設定を解除したりすることはできません。

-t
それぞれのnameに trace 属性を与えます。 トレースされた関数は、呼び出しシェルから DEBUG および RETURN トラップを継承します。 trace 属性は、変数に対して特別な意味を持ちません。

-x
環境を介して後続のコマンドにエクスポートするためのnameをマークします。
- の代わりに + を使用すると、代わりに属性がオフになりますが、+a を使用して配列変数を破棄することはできません。 関数で使用すると、 local コマンドと同様に、各名前をローカルにします。 変数名の後に =value が続く場合、変数の値は value に設定されます。 戻り値は、無効なオプションに遭遇したり、「-f foo=bar」を使用して関数を定義しようとしたり、読み取り専用変数に値を代入しようとしたり、 複合代入構文 (上記の「配列」を参照) を使用しない配列変数への値、namesの 1 つが有効なシェル変数名ではない、読み取り専用変数の読み取り専用ステータスをオフにしようとした、 配列変数の配列ステータスがオフであるか、存在しない関数を -f で表示しようとしています。 '-' の代わりに '+' を使用すると、代わりに属性がオフになりますが、+a を使用して配列変数を破棄することはできません。 関数で使用すると、 local コマンドと同様に、各名前をローカルにします。 変数名の後に =value が続く場合、変数の値は value に設定されます。 戻り値は、無効なオプションに遭遇したり、「-f foo=bar」を使用して関数を定義しようとしたり、読み取り専用変数に値を代入しようとしたり、 複合代入構文 (上記の「配列」を参照) を使用しない配列変数への値、namesの 1 つが有効なシェル変数名ではない、読み取り専用変数の読み取り専用ステータスをオフにしようとした、 配列変数の配列ステータスがオフであるか、存在しない関数を -f で表示しようとしています。
dirs [-clpv] [+n] [-n]
オプションを指定しないと、現在記憶されているディレクトリのリストが表示されます。 デフォルトの表示は、ディレクトリ名がスペースで区切られた 1 行です。 ディレクトリは pushd コマンドでリストに追加されます。 popd コマンドは、リストからエントリを削除します。
+n
オプションを指定せずに dirs を呼び出したときに表示されるリストの左から数えて n 番目のエントリをゼロから表示します。

-n
オプションなしで起動した場合に、dirs によって表示されるリストの右から数えて n 番目のエントリをゼロから表示します。
-c
すべてのエントリを削除して、ディレクトリ スタックをクリアします。
-l
より長いリストを生成します。 デフォルトのリスト形式では、チルダを使用してホーム ディレクトリを示します。
-p
1 行に 1 つのエントリでディレクトリ スタックを出力します。
-v
各エントリの前にスタック内のインデックスを付けて、ディレクトリ スタックを 1 行に 1 つのエントリで出力します。

各エントリの前にスタック内のインデックスを付けて、ディレクトリ スタックを 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 オプションは、これらのエスケープ文字がデフォルトで解釈されるシステム上であっても、それらの解釈を無効にします。 xpg_echo シェル オプションを使用すると、echo がこれらのエスケープ文字をデフォルトで展開するかどうかを動的に決定できます。 echo は、-- をオプションの終わりを意味するものとして解釈しません。echo は次のエスケープ シーケンスを解釈します。
\a
アラート (ベル)
\b
バックスペース
\c
末尾の改行を抑制
\e
エスケープ文字
\f
フォーム フィード
\n
改行
\r
改行
\t
水平タブ
\v
垂直タブ
\\
バックスラッシュ
\0nnn
値が 8 進数値 nnn (0 から 3 桁の 8 進数) である 8 ビット文字
\xHH
値が 16 進値 HH (1 桁または 2 桁の 16 進数) である 8 ビット文字
enable [-adnps] [-f filename] [name ...]
組み込みのシェル コマンドを有効または無効にします。組み込みコマンド を無効にすると、シェルは通常、ディスク コマンドの前に組み込みコマンド を検索しますが、フル パス名を指定せずにシェル組み込みコマンド と同じ名前のディスク コマンドを実行できます。 -n を使用すると、各nameが無効になります。 それ以外の場合、nameは有効になります。 たとえば、シェルの組み込みバージョンの代わりに PATH 経由で見つかった test バイナリを使用するには、「enable -n test」を実行します。 -f オプションは、動的ロードをサポートするシステムで、共有オブジェクト ファイル名から新しい組み込みコマンド名をロードすることを意味します。 -d オプションは、以前に -f でロードされた組み込みコマンド を削除します。 name 引数が指定されていない場合、または -p オプションが指定されている場合は、シェル組み込みのリストが出力されます。 他のオプション引数がない場合、リストはすべての有効なシェル組み込みコマンド で構成されます。 -n を指定すると、無効な組み込みコマンド のみが表示されます。 -a が指定された場合、表示されるリストにはすべての組み込みコマンド が含まれ、それぞれが有効かどうかが示されます。 -s が指定された場合、出力は POSIX 特殊組み込みコマンド に制限されます。 name がシェル組み込みコマンド でない場合、または共有オブジェクトから新しい組み込みコマンド をロードする際にエラーが発生した場合を除き、戻り値は 0 です。
eval [arg ...]
args が読み取られ、1 つのコマンドに連結されます。 次に、このコマンドがシェルによって読み取られて実行され、その終了ステータスが eval の値として返されます。 引数がない場合、または null 引数のみの場合、eval は 0 を返します。
 1$ VAR1='echo Hello, world!'
 2$ VAR2=VAR1
 3$
 4$ # evalを使うと変数展開を一度にできる
 5$ eval echo '$'$VAR2    # echo $VAR1 の実行と同じ
 6echo Hello, world!
 7$
 8$ # 「eval $変数名」で変数展開後の内容をコマンドとして実行できる
 9$ eval $VAR1
10Hello, world! 
11$
12$ # コマンド置換も展開して実行できる
13$ eval $(echo '$'$VAR2)
14Hello, world!
15$
16$ # 【参考】! により間接展開される(パラメータ展開を参照)
17$ echo ${!VAR2}
18echo Hello, world!
exec [-cl] [-a name] [command [arguments]]
command が指定されている場合は、シェルを置き換えます。 新しいプロセスは作成されません。 引数は、commandへの引数になります。
ex. 以下のシェルで2回sleepを実行、ただし2回目はexecをつけて実行。
1$ cat sample.sh
2#!/bin/bash
3sleep 3
4exec sleep 5
5$ ./sample.sh

上記シェル実行中に別端末でプロセス監視したものが以下。プロセスID 90538 が、途中で ./sample.sh から sleep 5 に置き換わっている。

 1$ while true;do ps -ef | grep -E "(\.sh$|sleep)" | grep -v grep; sleep 1; done
 2  501 90538 83934   0  2:54PM ttys001    0:00.01 /bin/bash ./sample.sh
 3  501 90539 90538   0  2:54PM ttys001    0:00.00 sleep 3
 4  501 90538 83934   0  2:54PM ttys001    0:00.01 /bin/bash ./sample.sh
 5  501 90539 90538   0  2:54PM ttys001    0:00.00 sleep 3
 6  501 90538 83934   0  2:54PM ttys001    0:00.01 /bin/bash ./sample.sh
 7  501 90539 90538   0  2:54PM ttys001    0:00.00 sleep 3
 8  501 90538 83934   0  2:54PM ttys001    0:00.01 sleep 5
 9  501 90538 83934   0  2:54PM ttys001    0:00.01 sleep 5
10  501 90538 83934   0  2:54PM ttys001    0:00.01 sleep 5
11  501 90538 83934   0  2:54PM ttys001    0:00.01 sleep 5

-l オプションが指定されている場合、シェルは command に渡される 0 番目の引数の先頭にダッシュを配置します。 これが login(1) が行うことです。 -c オプションを指定すると、コマンドは空の環境で実行されます。 -a が指定されている場合、シェルは実行されたコマンドの 0 番目の引数として name を渡します。 commandが何らかの理由で実行できない場合、非対話型シェルは終了します。ただし、シェル オプション execfail が有効になっている場合は失敗を返します。 ファイルを実行できない場合、対話型シェルは失敗を返します。

commandが指定されていない場合、リダイレクトは現在のシェルで有効になり、戻りステータスは 0 になります。リダイレクト エラーがある場合、戻りステータスは 1 です。(execによるリダイレクト設定例は UNIX/Linuxの部屋 コマンド:exec を参照)

以下の例は、画面出力とファイル出力を同時に行う設定です。例えばこれをシェルスクリプトの先頭に書けば、リダイレクトの効果が維持され、後続の各コマンドの画面出力は画面のみならずstdout.logとstderr.logにも出力されます。

1exec 1> >(tee -a stdout.log)
2exec 2> >(tee -a stderr.log)
exit [n]
シェルをステータス n で終了させます。 n を省略すると、終了ステータスは最後に実行されたコマンドのステータスになります。 EXIT のトラップは、シェルが終了する前に実行されます。
 1#!/bin/bash
 2cleanup() {
 3    echo "プロセスが終了します。クリーンアップ処理を実行中..."
 4    # ここにクリーンアップ処理を追加
 5}
 6# EXIT シグナルをキャッチして cleanup 関数を実行
 7trap cleanup EXIT
 8# 何らかの処理を実行
 9echo "プロセスが実行中です。"
10# プロセス終了
11exit 0
export [-fn] [name[=word]] ...
export -p
指定されたnameは、その後に実行されるコマンドの環境に自動的にエクスポートされるようにマークされます。 -f オプションを指定すると、nameは関数を参照します。 nameが指定されていない場合、または -p オプションが指定されている場合は、このシェルでエクスポートされたすべての名前のリストが出力されます。 -n オプションを指定すると、エクスポート プロパティが各nameから削除されます。 変数名の後に =word が続く場合、変数の値は word に設定されます。 export は、無効なオプションが検出された場合、nameの 1 つが有効なシェル変数名でない場合、または -f に関数ではないnameが指定された場合を除き、0 の終了ステータスを返します。
fc [-e ename] [-nlr] [first] [last]
fc -s [pat=rep] [cmd]
コマンドを修正します。 最初の形式では、firstからlastまでの一連のコマンドが履歴リストから選択されます。 first と last は、文字列 (その文字列で始まる最後のコマンドを見つけるため) または数値 (履歴リストへのインデックス。負の数値は現在のコマンド番号からのオフセットとして使用されます) として指定できます。 last が指定されていない場合、一覧表示用に現在のコマンドに設定され (したがって、``fc -l -10'' は最後の 10 個のコマンドを表示します)、それ以外の場合は first に設定されます。 first が指定されていない場合、編集の場合は前のコマンドに設定され、リストの場合は -16 に設定されます。

-n オプションは、一覧表示時にコマンド番号を抑制します。 -r オプションは、コマンドの順序を逆にします。 -l オプションを指定すると、コマンドが標準出力にリストされます。 それ以外の場合、これらのコマンドを含むファイルに対して ename で指定されたエディターが呼び出されます。 ename が指定されていない場合は、FCEDIT 変数の値が使用され、FCEDIT が設定されていない場合は EDITOR の値が使用されます。 どちらの変数も設定されていない場合は、vi が使用されます。 編集が完了すると、編集されたコマンドがエコーされて実行されます。

2 番目の形式では、pat の各インスタンスが rep に置き換えられた後に、command が再実行されます。 これで使用する便利なエイリアスは ``r="fc -s"'' です。これにより、``r cc'' と入力すると ``cc'' で始まる最後のコマンドが実行され、``r'' と入力すると再実行されます。 最後のコマンド。

最初の形式が使用された場合、無効なオプションが検出されたり、firstまたはlastに範囲外の履歴行が指定されていない限り、戻り値は 0 です。 -e オプションが指定されている場合、戻り値は最後に実行されたコマンドの値、またはコマンドの一時ファイルでエラーが発生した場合の失敗です。 2 番目の形式が使用された場合、cmd が有効な履歴行を指定しない限り、コマンドが再実行された状態が返されます。有効な履歴行が指定された場合、fc は失敗を返します。
fg [jobspec]
フォアグラウンドで jobspec を再開し、現在のジョブにします。 jobspec が存在しない場合、現在のジョブのシェルの概念が使用されます。 戻り値は、フォアグラウンドに配置されたコマンドの値、またはジョブ制御が無効なときに実行された場合の失敗、またはジョブ制御が有効な状態で実行されたときに、jobspec が有効なジョブを指定していない場合、または jobspec がジョブ制御なしで開始されたジョブを指定している場合です。

下の動画の例で、 sample.sh はカウンタを1から7まで表示するシェルスクリプト。 実行中に ctrl + z で中断。fg でjob番号を指定して再開。 fg 実行後は、中断前の出力済みのカウンタの次の値から出力されている。

getopts optstring name [args]
getopts は、シェル プロシージャで位置パラメータを解析するために使用されます。 optstring には、認識されるオプション文字が含まれています。 文字の後にコロンが続く場合、オプションには引数が必要であり、空白で区切る必要があります。 コロンと疑問符文字は、オプション文字として使用できません。 getopts は呼び出されるたびに、シェル変数 name に次のオプションを配置し、nameが存在しない場合はnameを初期化し、処理される次の引数のインデックスを変数 OPTIND に入れます。 OPTIND は、シェルまたはシェル スクリプトが呼び出されるたびに 1 に初期化されます。 オプションに引数が必要な場合、getopts はその引数を変数 OPTARG に入れます。 シェルは OPTIND を自動的にリセットしません。 新しいパラメータ セットを使用する場合は、同じシェル呼び出し内で getopts を複数回呼び出す間に手動でリセットする必要があります。

オプションの終わりに到達すると、getopts はゼロより大きい戻り値で終了します。 OPTIND は最初の非オプション引数のインデックスに設定され、name は ? に設定されます。

getopts は通常、位置パラメータを解析しますが、args にさらに引数が指定されている場合、getopts は代わりにそれらを解析します。

getopts は、2 つの方法でエラーを報告できます。 optstring の最初の文字がコロンの場合、サイレント エラー レポートが使用されます。 通常の操作では、無効なオプションまたは欠落しているオプション引数が検出されると、診断メッセージが出力されます。 変数 OPTERR が 0 に設定されている場合、optstring の最初の文字がコロンでなくても、エラー メッセージは表示されません。

無効なオプションが表示された場合、getopts はnameの中に ? を配置します。 サイレントでない場合は、エラー メッセージを出力し、OPTARG の設定を解除します。 getopts がサイレントの場合、見つかったオプション文字は OPTARG に配置され、診断メッセージは出力されません。

必要な引数が見つからず、getopts がサイレントでない場合、nameに疑問符 (?) が配置され、OPTARG が設定解除され、診断メッセージが出力されます。 getopts がサイレントである場合、nameにコロン (:) が配置され、見つかったオプション文字が OPTARG に設定されます。

指定または未指定のオプションが見つかった場合、getopts は true を返します。 オプションの最後に到達した場合、またはエラーが発生した場合は false を返します。
hash [-lr] [-p filename] [-dt] [name]
各nameについて、コマンドの完全なファイル名は、$PATH 内のディレクトリを検索することによって決定され、記憶されます。 -p オプションを指定すると、パス検索は実行されず、filename がコマンドの完全なファイル名として使用されます。 -r オプションを指定すると、シェルは記憶された場所をすべて忘れます。 -d オプションを指定すると、シェルは各名前の記憶された場所を忘れます。 -t オプションを指定すると、各nameに対応する絶対パス名が表示されます。 複数のname引数が -t で指定された場合、ハッシュされたフル パス名の前にnameが出力されます。 -l オプションを指定すると、入力として再利用できる形式で出力が表示されます。 引数が指定されていない場合、または -l のみが指定されている場合は、記憶されたコマンドに関する情報が出力されます。 nameが見つからないか無効なオプションが指定されていない限り、戻りステータスは true です。
help [-s] [pattern]
組み込みコマンドに関する役立つ情報を表示します。 pattern が指定されている場合、help は pattern に一致するすべてのコマンドの詳細なヘルプを表示します。 それ以外の場合は、すべての組み込みコマンド とシェル制御構造のヘルプが表示されます。 -s オプションは、表示される情報を短い使用法の概要に制限します。 パターンに一致するコマンドがない場合を除き、戻りステータスは 0 です。
history [n]
history -c
history -d offset
history -anrw [filename]
history -p arg [arg ...]
history -s arg [arg ...]
オプションを指定しないと、コマンド履歴リストが行番号付きで表示されます。 * が付いている行は変更されています。 n の引数は、最後の n 行のみをリストします。 シェル変数 HISTTIMEFORMAT が設定されていて null でない場合、それは strftime(3) が表示された各履歴エントリに関連付けられたタイムスタンプを表示するためのフォーマット文字列として使用されます。 フォーマットされたタイムスタンプと履歴行の間に空白は印刷されません。 filename が指定されている場合、履歴ファイルの名前として使用されます。 そうでない場合は、HISTFILE の値が使用されます。 オプションが指定されている場合、次の意味があります。
-c
すべてのエントリを削除して履歴リストをクリアします。
-d offset
位置offsetの履歴エントリを削除します。
-a
「new」履歴行 (現在の bash セッションの開始以降に入力された履歴行) を履歴ファイルに追加します。
-n
履歴ファイルからまだ読み込まれていない履歴行を現在の履歴リストに読み込みます。これらは、現在の bash セッションの開始以降に履歴ファイルに追加された行です。
-r
履歴ファイルの内容を読み取り、現在の履歴として使用します。
-w
現在の履歴を履歴ファイルに書き込み、履歴ファイルの内容を上書きします。
-p
次のargsに対して履歴置換を実行し、結果を標準出力に表示します。 結果を履歴リストに保存しません。 通常の履歴展開を無効にするには、各argを引用符で囲む必要があります。
-s
履歴リストにargsを単一のエントリとして保存します。 履歴リストの最後のコマンドは、argsが追加される前に削除されます。
HISTTIMEFORMAT が設定されている場合、各履歴エントリに関連付けられたタイム スタンプ情報が履歴ファイルに書き込まれます。 無効なオプションが検出された場合、履歴ファイルの読み取りまたは書き込み中にエラーが発生した場合、-d の引数として無効なoffsetが指定された場合、または -p の引数として指定された履歴の展開が失敗した場合を除き、戻り値は 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 などの大文字と小文字を区別しないシグナル名 (SIG プレフィックスの有無にかかわらず) またはシグナル番号のいずれかです。 signum はシグナル番号です。 sigspec が存在しない場合、SIGTERM が想定されます。

-l の引数は、シグナル名をリストします。 -l が指定されたときに引数が指定された場合、引数に対応するシグナルの名前がリストされ、戻りステータスは 0 になります。-l の exit_status 引数は、シグナル番号またはシグナルによって終了したプロセスの終了ステータスを指定する数値です。

 1$ kill -l
 2 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL
 3 5) SIGTRAP	 6) SIGABRT	 7) SIGEMT	 8) SIGFPE
 4 9) SIGKILL	10) SIGBUS	11) SIGSEGV	12) SIGSYS
 513) SIGPIPE	14) SIGALRM	15) SIGTERM	16) SIGURG
 617) SIGSTOP	18) SIGTSTP	19) SIGCONT	20) SIGCHLD
 721) SIGTTIN	22) SIGTTOU	23) SIGIO	24) SIGXCPU
 825) SIGXFSZ	26) SIGVTALRM	27) SIGPROF	28) SIGWINCH
 929) SIGINFO	30) SIGUSR1	31) SIGUSR2
10$ kill -l SIGSTOP
1117
12$ kill -l 17
13STOP

kill は、少なくとも 1 つのシグナルが正常に送信された場合は true を返し、エラーが発生した場合や無効なオプションが検出された場合は false を返します。

let arg [arg ...]
各 arg は、評価される算術式です (ARITHMETIC EVALUATION を参照)。 最後のargが 0 に評価される場合、let は 1 を返します。 それ以外の場合は 0 が返されます。
local [option] [name[=value] ...]
引数ごとに、name という名前のローカル変数が作成され、valueが割り当てられます。 optionは、declare によって受け入れられる任意のオプションにすることができます。 関数内で local を使用すると、変数nameの可視スコープがその関数とその子に制限されます。 オペランドがない場合、 local はローカル変数のリストを標準出力に書き込みます。 関数内にないときに local を使用するとエラーになります。 local が関数の外で使用されているか、無効なnameが指定されているか、nameが読み取り専用の変数でない限り、戻りステータスは 0 です。
logout
ログイン シェルを終了します。
popd [-n] [+n] [-n]
ディレクトリ スタックからエントリを削除します。 引数なしで、スタックから最上位ディレクトリを削除し、新しい最上位ディレクトリへの cd を実行します。 引数が指定されている場合、次の意味があります。
+n
dirs で示されるリストの左からゼロから数えて n 番目のエントリを削除します。 例: ``popd +0'' は最初のディレクトリを削除し、``popd +1'' は 2 番目のディレクトリを削除します。
-n
dirs で示されるリストの右側からゼロから数えて n 番目のエントリを削除します。 例: ``popd -0'' は最後のディレクトリを削除し、``popd -1'' は最後から 2 番目のディレクトリを削除します。
-n
スタックからディレクトリを削除するときに、ディレクトリの通常の変更を抑制し、スタックのみが操作されるようにします。
popd コマンドが成功した場合、dirs も実行され、戻りステータスは 0 です。popd は、無効なオプションが検出された場合、ディレクトリ スタックが空である場合、存在しないディレクトリ スタック エントリが指定された場合、またはディレクトリが 変更は失敗します。
printf [-v var] format [arguments]
format の制御下で、フォーマットされた arguments を標準出力に書き込みます。 format は次の3種類のオブジェクトを含む文字列です。
  1. 単純に標準出力にコピーされるプレーン文字
  2. 変換されて標準出力にコピーされる文字エスケープシーケンス(\n など)
  3. それぞれ次の連続する引数の出力を引き起こすフォーマット仕様(%s など)

標準の printf(1) 形式に加えて、%b を使用すると、printf は対応する argument でバックスラッシュ エスケープ シーケンスを展開します (ただし \c は出力を終了し、\', \" および \? のバックスラッシュは削除されず、8 進エスケープは \0 で始まる場合は 4 桁まで)。 %q を指定すると、printf は対応する argument をシェル入力として再利用できる形式で出力します。
-v オプションを指定すると、標準出力に出力されるのではなく、変数 var に割り当てられます。

1$ # \x41 は 'A' の16進表記、\0101 は 'A' の8進表記
2$ printf -v var '[%b] [%q] [%b]\n' '\x41' '$%&@!{ ' '\0101\c出力されない'
3$ echo $var
4[A] [\$%\&@\!\{\ ] [A

すべての arguments を使用するために、必要に応じて format が再利用されます。 指定された数よりも多くの argumentsformat に必要な場合、追加のフォーマット指定は、必要に応じてゼロ値または NULL 文字列が指定されたかのように動作します。 戻り値は、成功した場合はゼロ、失敗した場合はゼロ以外です。

1$ # C言語のprintf関数と異なり、引数が多い場合、フォーマット指定が再利用される
2$ printf "[%b]\n" "\x5a" "\0131" "abc\tefg"
3[Z]
4[Y]
5[abc	efg]

printf コマンドは、こちらの外部サイトに多くの例が示されています。

pushd [-n] [dir]
pushd [-n] [+n] [-n]
ディレクトリ スタックの一番上にディレクトリを追加するか、スタックをローテーションして、スタックの新しい一番上を現在の作業ディレクトリにします。 引数がない場合、ディレクトリ スタックが空でない限り、上位 2 つのディレクトリを交換し、0 を返します。 引数が指定されている場合、次の意味があります。
+n
スタックを回転させて、n 番目のディレクトリ (dirs で表示されるリストの左から数えてゼロから数えます) が一番上になるようにします。
-n
スタックをローテーションして、n 番目のディレクトリ (dirs で表示されるリストの右から数えてゼロから数えます) が一番上になるようにします。
-n
スタックにディレクトリを追加するときに、ディレクトリの通常の変更を抑制し、スタックのみが操作されるようにします。
dir
dir をディレクトリ スタックの一番上に追加し、それを新しい現在の作業ディレクトリにします。
pushd コマンドが成功すると、dirs も実行されます。 最初の形式を使用すると、 dir に対する cd が失敗しない限り、pushd は 0 を返します。 2 番目の形式では、ディレクトリ スタックが空であるか、存在しないディレクトリ スタック要素が指定されているか、指定された新しい現在のディレクトリへのディレクトリ変更が失敗しない限り、pushd は 0 を返します。
pwd [-LP]
現在の作業ディレクトリの絶対パス名を出力します。 -P オプションが指定されている場合、または set 組み込みコマンドの -o physical オプションが有効になっている場合、表示されるパス名にはシンボリック リンクが含まれません。 -L オプションを使用すると、表示されるパス名にシンボリック リンクが含まれる場合があります。 現在のディレクトリの名前の読み取り中にエラーが発生した場合、または無効なオプションが指定された場合を除き、戻りステータスは 0 です。
read [-ers] [-u fd] [-t timeout] [-a aname] [-p prompt] [-n nchars] [-d delim] [name ...]
標準入力、または -u オプションの引数として指定されたファイル記述子 fd から1行が読み取られ、最初の単語が最初の name に、2番目の単語から2番目の name 、というように、残りの単語とその間の区切り文字が最後の name に割り当てられます。 入力ストリームから読み取られる単語が names よりも少ない場合、残りの names には空の値が割り当てられます。 IFS の文字は、行を単語に分割するために使用されます。 バックスラッシュ文字 (\) を使用して、次に読み取られる文字と行継続の特別な意味を取り除くことができます。 オプションが指定されている場合、次の意味があります。
-a aname
単語は、0 から始まる配列変数 aname の連続インデックスに割り当てられます。 aname は、新しい値が割り当てられる前に設定解除されます。 他のname引数は無視されます。
-d delim
delim の最初の文字は、改行ではなく、入力行を終了するために使用されます。
-e
標準入力が端末から来ている場合、行を取得するために readline (上記の READLINE を参照) が使用されます。
-n nchars
read は、入力行全体を待つのではなく、nchars 文字を読み取った後に戻ります。
-p prompt
入力を読み取ろうとする前に、末尾の改行なしで、標準エラー出力に prompt を表示します。 prompt は、入力が端末からのものである場合にのみ表示されます。
-r
バックスラッシュはエスケープ文字として機能しません。 バックスラッシュは行の一部と見なされます。 特に、バックスラッシュと改行のペアは、行の継続として使用できません。
-s
サイレント モード。 入力が端末からのものである場合、文字はエコーされません。
-t timeout
入力の完全な行がtimeout秒以内に読み取られない場合、読み取りがタイムアウトになり、失敗が返されます。 read が端末またはパイプから入力を読み取っていない場合、このオプションは効果がありません。
-u fd
ファイル記述子 fd から入力を読み取ります。
names が指定されていない場合、読み取られた行は変数 REPLY に割り当てられます。 ファイルの終わりに到達した場合、読み取りがタイムアウトした場合、または無効なファイル記述子が -u の引数として指定された場合を除き、戻り値はゼロです。

ex1.
シェルスクリプトでパスワード入力を受け付ける。ただし入力中は表示させない。
 1#!/bin/bash
 2unset password
 3prompt="パスワードを入力してください:"
 4while IFS= read -p "$prompt" -r -s -n 1 char
 5  # -n 1 で1文字readしてcharに設定
 6  # -s : 入力値を非表示とする
 7  # -r : エスケープ(\)の無効化。\ + Enterキーで入力継続させない
 8  # IFS= の設定が無いとスペース打込みでreadが完了する
 9do
10  if [[ $char == $'\0' ]];then break; fi  # Enterキー押下でループ脱出
11  prompt='*'
12  password+="$char"
13done
14echo
15echo "パスワードは「${password}」ですね"

上記のsample.shの実行時の様子


ex2.
以下はファイル記述子を指定する例。 while の外側の入力ファイル(プロセス置換)のファイル記述子を 3 としている。 もしファイル記述子を使わなければ、 while で2箇所に記述している read のいずれも標準入力からの読み取りとなり、個別のファイルごとの read にならない。
1while read -u 3 line; do
2  echo "$line を配列に追加しますか? [y/n] : "
3  read ans
4  if [ "$ans" == "y" ]; then arr+=($line); fi
5done 3< <(echo -e "apple\norange\ngrape")
6echo ${arr[*]}
readonly [-apf] [name[=word] ...]
与えられたnamesは読み取り専用としてマークされます。 これらのnamesの値は、その後の割り当てによって変更されることはありません。 -f オプションを指定すると、namesに対応する関数がそのようにマークされます。 -a オプションは、変数を配列に制限します。 name 引数が指定されていない場合、または -p オプションが指定されている場合は、すべての読み取り専用の名前のリストが出力されます。 -p オプションを指定すると、入力として再利用できる形式で出力が表示されます。 変数名の後に =word が続く場合、変数の値は word に設定されます。 無効なオプションが検出された場合、namesの 1 つが有効なシェル変数名でない場合、または -f に関数ではないnameが指定された場合を除き、戻りステータスは 0 です。
return [n]
n で指定された戻り値で関数を終了させます。 n を省略すると、関数本体で最後に実行されたコマンドのステータスが返されます。 関数の外で使用されたが、. (source) コマンドを実行すると、シェルはそのスクリプトの実行を停止し、n またはスクリプト内で最後に実行されたコマンドの終了ステータスをスクリプトの終了ステータスとして返します。 関数の外部で使用され、. によるスクリプトの実行中に使用されない場合、戻りステータスは false になります。 関数またはスクリプトの後、実行が再開される前に、RETURN トラップに関連付けられたすべてのコマンドが実行されます。
set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
オプションを指定しない場合、各シェル変数の名前と値は、現在設定されている変数を設定またはリセットするための入力として再利用できる形式で表示されます。 読み取り専用変数はリセットできません。 posix モードでは、シェル変数のみがリストされます。 出力は、現在のロケールに従ってソートされます。 オプションを指定すると、シェル属性が設定または設定解除されます。 オプションが処理された後に残っている引数は、位置パラメータの値として扱われ、順番に $1、$2、... $n に割り当てられます。 オプションが指定されている場合、次の意味があります。
-a
後続のコマンドの環境にエクスポートするために変更または作成された変数と関数を自動的にマークします。
-b
終了したバックグラウンド ジョブのステータスを、次のプライマリ プロンプトの前ではなく、すぐに報告します。 ジョブ制御が有効な場合のみ有効です。
-e
単純なコマンド (SHELL GRAMMARを参照) がゼロ以外のステータスで終了した場合、すぐに終了します。 失敗したコマンドが while または until キーワードの直後のコマンド リストの一部である場合、if ステートメントのテストの一部である場合、&& または || リストの一部である場合、シェルは終了しません。ERR のトラップが設定されている場合、シェルが終了する前に実行されます。
-f
パス名の展開を無効にします。
-h
実行のために検索されるコマンドの場所を記憶します。 これはデフォルトで有効になっています。
-k
コマンド名の前にある引数だけでなく、割り当てステートメントの形式のすべての引数がコマンドの環境に置かれます。
-m
モニターモード。 ジョブ制御が有効です。 このオプションは、それをサポートするシステム上の対話型シェルではデフォルトでオンになっています (上記の JOB CONTROL を参照)。 バックグラウンド プロセスは別のプロセス グループで実行され、終了ステータスを含む行が完了時に出力されます。
-n
コマンドを読み取りますが、実行しません。 これは、シェル スクリプトの構文エラーをチェックするために使用できます。 これは、インタラクティブ シェルでは無視されます。
-o option-name
option-nameは次のいずれかです。
allexport
-a と同じ。
braceexpand
-B と同じ。
emacs
emacs スタイルのコマンド ライン編集インターフェイスを使用します。 これは、シェルが --noediting オプションで開始されない限り、シェルが対話型の場合にデフォルトで有効になります。
errtrace
-E と同じ。
functrace
-T と同じ。
errexit
-e と同じ。
hashall
-h と同じ。
histexpand
-H と同じ。
history
上記の HISTORY で説明したように、コマンド履歴を有効にします。 このオプションは、対話型シェルではデフォルトでオンになっています。
ignoreeof
その効果は、あたかもシェルコマンド ``IGNOREEOF=10'' が実行されたかのようです (上記のシェル変数を参照)。
keyword
-k と同じ。
monitor
-m と同じ。
noclobber
-C と同じ。
noexec
-n と同じ。
noglob
-f と同じ。 nolog は現在は無視されます。
notify
-b と同じ。
nounset
-u と同じ。
onecmd
-t と同じ。
physical
-P と同じ。
pipefail
設定されている場合、パイプラインの戻り値は、最後 (右端) のコマンドがゼロ以外のステータスで終了するか、すべてのコマンドが正常に終了した場合はゼロになります。 このオプションはデフォルトで無効になっています。
posix
デフォルトの動作が POSIX 標準と異なる bash の動作を標準 (posix モード) に一致するように変更します。
privileged
-p と同じ。
verbose
-v と同じ。
vi
vi スタイルのコマンド ライン編集インターフェイスを使用します。
xtrace
-x と同じ。

option-nameを指定せずに -o を指定すると、現在のオプションの値が出力されます。 option-nameなしで +o を指定すると、現在のオプション設定を再作成するための一連の set コマンドが標準出力に表示されます。

-p
特権モードをオンにします。 このモードでは、$ENV および $BASH_ENV ファイルは処理されず、シェル関数は環境から継承されず、SHELLOPTS 変数が環境に表示されても無視されます。 実際のユーザー (グループ) ID と等しくない実効ユーザー (グループ) ID でシェルが開始され、-p オプションが指定されていない場合、これらのアクションが実行され、実効ユーザー ID が実際のユーザー ID に設定されます。 起動時に -p オプションを指定すると、実効ユーザー ID はリセットされません。 このオプションをオフにすると、有効なユーザー ID とグループ ID が実際のユーザー ID とグループ ID に設定されます。
-t
1 つのコマンドを読み込んで実行した後、終了します。
-u
パラメータ展開の実行時に、設定されていない変数をエラーとして扱います。 設定されていない変数で展開が試行されると、シェルはエラー メッセージを出力し、対話的でない場合は、ゼロ以外のステータスで終了します。
-v
シェル入力行を読み取ったときに表示します。
-x
コマンド、ケース コマンド、選択コマンド、またはコマンドの演算の各単純コマンドを展開した後、PS4 の展開された値を表示し、続いてコマンドとその展開された引数または関連する単語リストを表示します。
-B
シェルはブレース展開を実行します (上記の「ブレース展開」を参照)。 これはデフォルトでオンになっています。
-C
設定されている場合、bash は既存のファイルを >、>&、および <> リダイレクト演算子で上書きしません。 これは、リダイレクト演算子 >| を使用して出力ファイルを作成するときにオーバーライドされる場合があります。 >の代わりに。
-E
設定されている場合、ERR のすべてのトラップは、シェル関数、コマンド置換、およびサブシェル環境で実行されるコマンドによって継承されます。 このような場合、ERR トラップは通常継承されません。
-H
有効にします! スタイル履歴の置換。 シェルが対話型の場合、このオプションはデフォルトでオンになっています。
-P
設定すると、現在の作業ディレクトリを変更する cd などのコマンドを実行するときに、シェルはシンボリック リンクをたどりません。 代わりに、物理ディレクトリ構造を使用します。 デフォルトでは、現在のディレクトリを変更するコマンドを実行するとき、bash はディレクトリの論理チェーンに従います。
-T
設定されている場合、DEBUG および RETURN のすべてのトラップは、シェル関数、コマンド置換、およびサブシェル環境で実行されるコマンドによって継承されます。 このような場合、通常、DEBUG および RETURN トラップは継承されません。
--
このオプションの後に引数がない場合、位置パラメータは設定解除されます。 それ以外の場合、引数の一部が - で始まる場合でも、位置パラメータが args に設定されます。
-
オプションの終わりを通知し、残りのすべてのargを位置パラメータに割り当てます。 -x および -v オプションはオフになっています。 argがない場合、位置パラメータは変更されません。
特に明記しない限り、オプションはデフォルトでオフになっています。 - ではなく + を使用すると、これらのオプションがオフになります(使用例:set +B)。 オプションは、シェルの呼び出しに対する引数として指定することもできます。 現在のオプションのセットは $- にあります。 無効なオプションが検出されない限り、戻りステータスは常に true です。
shift [n]
n+1 ... からの位置パラメータは $1 ... に名前が変更されます。 $# から $#-n+1 までの数字で表されるパラメータは未設定です。 n は、$# 以下の負でない数値でなければなりません。 n が 0 の場合、パラメータは変更されません。 n が指定されていない場合は、1 と見なされます。n が $# より大きい場合、位置パラメータは変更されません。 n が $# より大きいかゼロより小さい場合、戻りステータスはゼロより大きいです。 それ以外の場合は 0。
 1$ cat sample.sh
 2#!/bin/bash
 3echo 位置パラメータの数は$#
 4echo $1 $2 $3 $4 $5
 5shift
 6echo 位置パラメータの数は$#
 7echo $1 $2 $3 $4 $5
 8
 9$ ./sample.sh a b c d e
10位置パラメータの数は5
11a b c d e
12位置パラメータの数は4
13b c d e
shopt [-pqsu] [-o] [optname ...]
オプションのシェルの動作を制御する変数の値を切り替えます。 オプションを指定しない場合、または -p オプションを指定すると、設定可能なすべてのオプションのリストが表示され、それぞれが設定されているかどうかが示されます。 -p オプションを指定すると、入力として再利用できる形式で出力が表示されます。 その他のオプションの意味は次のとおりです。
-s
各 optname を有効 (設定) にします。
-u
各 optname を無効 (設定解除) します。
-q
通常の出力を抑制します (quiet モード)。 戻りステータスは、optname が設定されているか設定解除されているかを示します。 -q で複数の optname 引数が指定された場合、すべての optname が有効であれば戻りステータスはゼロになります。 それ以外の場合は非ゼロ。
-o
optname の値を組み込みコマンド set の -o オプションで定義された値に制限します。
-s または -u が optname 引数なしで使用された場合、表示はそれぞれ設定されているオプションまたは設定されていないオプションに限定されます。 特に明記されていない限り、shopt オプションはデフォルトで無効 (未設定) になっています。
すべての optname が有効になっている場合、オプションを一覧表示するときの戻りステータスはゼロであり、それ以外の場合はゼロ以外です。 オプションを設定または設定解除すると、optname が有効なシェル オプションでない限り、戻りステータスはゼロになります。
shopt オプションのリストは次のとおりです。
cdable_vars
設定されている場合、ディレクトリではない cd 組み込みコマンドへの引数は、値が変更先のディレクトリである変数の名前であると見なされます。
cdspell
設定されている場合、cd コマンドのディレクトリ コンポーネントのスペルの軽微なエラーが修正されます。 チェックされるエラーは、転置された文字、欠落した文字、および 1 文字が多すぎることです。 修正が見つかった場合は、修正されたファイル名が出力され、コマンドが続行されます。 このオプションは、インタラクティブ シェルでのみ使用されます。
checkhash
設定されている場合、bash は実行を試みる前に、ハッシュ テーブルにあるコマンドが存在することを確認します。 ハッシュされたコマンドが存在しなくなった場合、通常のパス検索が実行されます。
checkwinsize
設定されている場合、bash は各コマンドの後にウィンドウ サイズをチェックし、必要に応じて LINES と COLUMNS の値を更新します。 cmdhist 設定されている場合、bash は複数行のコマンドのすべての行を同じ履歴エントリに保存しようとします。 これにより、複数行のコマンドを簡単に再編集できます。
compat31
設定されている場合、条件付きコマンドの =~ 演算子への引用符で囲まれた引数に関して、bash はその動作をバージョン 3.1 の動作に変更します。 dotglob 設定すると、bash には「.」で始まるファイル名が含まれます。 パス名展開の結果。
dotglob
設定すると、bash には「.」で始まるファイル名が含まれます。 パス名展開の結果。
execfail
設定されている場合、exec 組み込みコマンドの引数として指定されたファイルを実行できない場合、非対話型シェルは終了しません。 exec が失敗した場合、対話型シェルは終了しません。
expand_aliases
設定されている場合、エイリアスは上記の ALIASES で説明されているように展開されます。 このオプションは、対話型シェルではデフォルトで有効になっています。
extdebug
設定されている場合、デバッガーによる使用を目的とした動作が有効になります。
  1. 組み込みコマンド declare の -F オプションは、引数として指定された各関数名に対応するソース ファイル名と行番号を表示します。
  2. DEBUG トラップによって実行されるコマンドがゼロ以外の値を返す場合、次のコマンドはスキップされ、実行されません。
  3. DEBUG トラップによって実行されるコマンドが値 2 を返し、シェルがサブルーチン (シェル関数または . または組み込みコマンド source によって実行されるシェル スクリプト) で実行されている場合、return の呼び出しがシミュレートされます。
  4. 上記の説明に従って、BASH_ARGC および BASH_ARGV が更新されます。(シェル変数BASH_ARGCの説明を参照)
  5. 関数トレースが有効になります。コマンド置換、シェル関数、および ( command ) で呼び出されるサブシェルは、DEBUG および RETURN トラップを継承します。
  6. エラー トレースが有効になります。コマンド置換、シェル関数、および ( command ) で呼び出されるサブシェルは、ERROR トラップを継承します。 extglob 設定すると、上記のパス名展開で説明した拡張パターンマッチング機能が有効になります。
extquote
設定されている場合、$'string' および $"string" の引用は、ダブルクォートで囲まれた ${parameter} 展開内で実行されます。 このオプションはデフォルトで有効になっています。
failglob
設定されている場合、パス名の展開中にファイル名の一致に失敗したパターンは、展開エラーになります。
force_fignore
設定されている場合、FIGNORE シェル変数で指定された接尾辞により、無視された単語が唯一の可能な補完であっても、単語補完を実行するときに単語が無視されます。 FIGNORE の説明については、上記の SHELL VARIABLES を参照。 このオプションはデフォルトで有効になっています。
gnu_errfmt
設定されている場合、シェル エラー メッセージは標準の GNU エラー メッセージ形式で書き込まれます。
histappend
設定されている場合、履歴リストは、ファイルを上書きするのではなく、シェルの終了時に HISTFILE 変数の値で指定されたファイルに追加されます。
histreedit
設定されていて、readline が使用されている場合、失敗した履歴置換を再編集する機会がユーザーに与えられます。
histverify
設定されていて、readline が使用されている場合、履歴置換の結果はすぐにシェルパーサーに渡されません。 代わりに、結果の行が readline 編集バッファーにロードされ、さらに変更できるようになります。
hostcomplete
設定されていて、readline が使用されている場合、@ を含む単語が補完されると、bash はホスト名の補完を実行しようとします (上記の READLINE での「補完」を参照)。 これはデフォルトで有効になっています。
huponexit
設定されている場合、bash は対話型ログイン シェルの終了時にすべてのジョブに SIGHUP を送信します。 interactive_comments 設定されている場合、# で始まる単語により、その単語とその行の残りのすべての文字が対話型シェルで無視されるようになります (上記の COMMENTS を参照)。 このオプションはデフォルトで有効になっています。 lithist 設定されていて、cmdhist オプションが有効になっている場合、複数行のコマンドは、可能な場合はセミコロン区切り記号を使用するのではなく、改行を埋め込んで履歴に保存されます。
login_shell
シェルがログイン シェルとして開始された場合、シェルはこのオプションを設定します (上記の INVOCATION を参照)。 値は変更できません。
mailwarn
設定されていて、bash がメールをチェックしているファイルが最後にチェックされてからアクセスされた場合、「メールファイル内のメールが読み取られました」というメッセージが表示されます。
no_empty_cmd_completion
設定されていて、readline が使用されている場合、空の行で補完が試行されたときに、bash は可能な補完を PATH で検索しようとしません。
nocaseglob
設定されている場合、bash は、パス名の展開を実行するときに、大文字と小文字を区別しない方法でファイル名を照合します (上記の「パス名の展開」を参照)。
nocasematch
設定されている場合、bash は、case または [[ 条件付きコマンドの実行中にマッチングを実行するときに、大文字と小文字を区別しない方法でパターンをマッチングします。
nullglob
設定されている場合、bash は、どのファイルとも一致しないパターン (上記の「パス名の展開」を参照) を、それ自体ではなく、null 文字列に展開することを許可します。
progcomp
設定されている場合、プログラム可能な補完機能 (上記の「プログラム可能な補完」を参照) が有効になります。 このオプションはデフォルトで有効になっています。
promptvars
設定されている場合、プロンプト文字列は、上記の「プロンプト」で説明したように展開された後、パラメータ展開、コマンド置換、算術展開、および引用符の削除を受けます。 このオプションはデフォルトで有効になっています。
restricted_shell
制限モードで開始された場合、シェルはこのオプションを設定します (RESTRICTED SHELLを参照)。 値は変更できません。 これは、起動ファイルの実行時にリセットされないため、起動ファイルはシェルが制限されているかどうかを検出できます。
shift_verbose
設定されている場合、シフト カウントが位置パラメータの数を超えると、組み込みコマンド shift はエラー メッセージを出力します。
sourcepath
設定されている場合、組み込みコマンド source (.) は PATH の値を使用して、引数として提供されたファイルを含むディレクトリを検索します。 このオプションはデフォルトで有効になっています。
xpg_echo
設定されている場合、組み込みの echo はデフォルトでバックスラッシュとエスケープ シーケンスを展開します。
suspend [-f]
SIGCONT シグナルを受信するまで、このシェルの実行を中断します。 -f オプションは、これがログイン シェルである場合に文句を言わないように指示します。 とにかく中断するだけです。 シェルがログイン シェルであり、-f が指定されていない場合、またはジョブ制御が有効になっていない場合を除き、戻りステータスは 0 です。
test expr
[ expr ]
条件式 expr の評価に応じて、0 または 1 のステータスを返します。 各演算子とオペランドは、個別の引数である必要があります。 式は、上記の「条件式」で説明したプライマリで構成されます。 test はオプションを受け入れません。また、オプションの終わりを示すものとして -- の引数を受け入れて無視することもありません。
式は、次の演算子を使用して組み合わせることができます。優先度の高い順にリストされています。
! expr
expr が false の場合は true。
( expr )
expr の値を返します。 これは、演算子の通常の優先順位をオーバーライドするために使用できます。
expr1 -a expr2
expr1 と expr2 の両方が true の場合は true。
expr1 -o expr2
expr1 または expr2 のいずれかが true の場合は true。

test と [ は、引数の数に基づく一連のルールを使用して条件式を評価します。

0個の引数
式は偽です。
1 個の引数
式は、引数が null でない場合にのみ true になります。
2 個の引数
最初の引数が ! の場合、式は 2 番目の引数が null の場合にのみ true になります。 最初の引数が上記の「条件式」の下にリストされている単項条件演算子の 1 つである場合、単項テストが true の場合、式は true になります。 最初の引数が有効な単項条件演算子でない場合、式は false になります。
3 個の引数
2 番目の引数が上記の「条件式」の下にリストされている 2 項条件演算子の 1 つである場合、式の結果は、1 番目と 3 番目の引数をオペランドとして使用した 2 項テストの結果になります。 最初の引数が ! の場合、値は 2 番目と 3 番目の引数を使用した 2 引数テストの否定です。 最初の引数が正確に (そして 3 番目の引数が正確に ) である場合、結果は 2 番目の引数の 1 つの引数のテストになります。 それ以外の場合、式は false です。 この場合、-a および -o 演算子は二項演算子と見なされます。
4 個の引数
最初の引数が ! の場合、結果は残りの引数で構成される 3 個の引数式の否定になります。 それ以外の場合、式は上記の規則を使用して優先順位に従って解析および評価されます。
5個以上の引数
式は、上記のルールを使用して優先順位に従って解析および評価されます。
times
シェルとシェルから実行されたプロセスの累積ユーザー時間とシステム時間を出力します。 戻りステータスは 0 です。
trap [-lp] [[arg] sigspec ...]
シェルがシグナル sigspec を受け取ると、コマンド arg が読み込まれて、実行されます。 arg が存在しない (かつ sigspec が一つ指定された) 場合か、 arg が - の場合、 指定されたシグナルは全てオリジナルの動作 (シェルの起動時に設定されていた値) にリセットされます。 arg が空文字列である場合、それぞれの sigspec で指定されたシグナルは、 シェルとシェルが起動したコマンドから無視されます。 arg なしで -p オプションが与えられた場合、 各 sigspec に関連付けられた trap コマンドが表示されます。 引き数が全くないか、 -p だけが与えられた場合、 trap は各シグナルに関連付けられたコマンドのリストを出力します。 -l オプションを与えると、 シェルはシグナル名と対応する番号のリストを出力します。 それぞれの sigspec は、 で定義されているシグナル名、またはシグナル番号です。 シグナル名は大文字小文字は区別されず、先頭の SIG は省略可能です。

sigspec が 0 または EXIT であれば、シェルの終了時にコマンド arg が実行されます (exitを参照)。 sigspec が DEBUG であれば、各々の 単純なコマンド、for コマンド、case コマンド、select コマンド、各々の算術 for コマンドの前、およびシェル関数の最初のコマンドの実行前 (前述の シェルの文法セクションを参照) に、コマンド arg が実行されます。 DEBUG のトラップの影響についての詳細は組み込みコマンド shopt の extdebug オプションの説明を参照してください。 sigspec が RETURN であれば、シェル関数の実行、または組み込みコマンドの . や source で実行されたスクリプトの実行が終わるたびにコマンド arg が実行されます。

sigspec が ERR であれば、 単純なコマンドが 0 以外の終了ステータスのときにコマンド arg が実行されます。 ただし、失敗したコマンドが、 while または until キーワード直後のコマンドリストに含まれる場合、 if 文の条件に含まれる場合、 && や || のリスト中で実行するコマンドに含まれる場合、 および、コマンドの戻り値が ! で反転されている場合には、 ERR のトラップは実行されません。 これらは errexit オプションが従う条件と同じです。

以下の例では、存在しないファイル a, b に対して diff を実行してエラーを発生させ、それを trap してエラーとなったシェルファイル名、行番号、コマンド、コマンドの終了ステータスを出力している。

 1$ awk '{printf("%3d  %s\n", NR, $0)}' sample.sh  # ファイル内容を行番号付きで表示
 2  1  #!/bin/bash
 3  2  err(){
 4  3      STATUS=$?
 5  4      echo "単純なコマンドの実行でエラーが発生しました"
 6  5      echo "${BASH_SOURCE##*/}: $BASH_LINENO: $BASH_COMMAND: $STATUS"
 7  6      exit 1
 8  7  }
 9  8  trap err ERR
10  9  (diff a b)    # 単純なコマンドでないため trap されない
11 10  echo "test1"
12 11  diff a b
13 12  echo "test2"
14$
15$ ./sample.sh
16diff: a: No such file or directory
17test1
18diff: a: No such file or directory
19単純なコマンドの実行でエラーが発生しました
20sample.sh: 11: diff a b: 2

シェルに入る際に無視されるシグナルは、 トラップもリセットもできません。 無視されなかったシグナルのトラップは、 サブシェルやサブシェル環境では作られたときに 元の値にリセットされます。 sigspec のいずれかが不正であれば、返却ステータスは偽になります。 それ以外の場合には、 trap は真を返します。

type [-aftpP] name [name ...]
オプションなしで、コマンド名として使用された場合に各nameがどのように解釈されるかを示します。 -t オプションが使用されている場合、type は、name がエイリアス、シェルの予約語、関数、組み込み、または ディスクファイルの場合、それぞれalias、keyword、function、builtin、またはfileのいずれかである文字列を出力します。 name が見つからない場合、何も表示されず、終了ステータス false が返されます。 -p オプションが使用された場合、type は、name がコマンド名として指定された場合に実行されるディスク ファイルの名前を返すか、「type -t name」がファイルを返さない場合は何も返しません。 -P オプションは、``type -t name'' が file を返さない場合でも、各名前の PATH 検索を強制します。 コマンドがハッシュされている場合、-p と -P はハッシュされた値を出力しますが、必ずしも PATH で最初に現れるファイルではありません。 -a オプションを使用すると、type は name という名前の実行可能ファイルを含むすべての場所を出力します。 これには、-p オプションも使用されていない場合に限り、エイリアスと関数が含まれます。 -a を使用する場合、ハッシュ化されたコマンドのテーブルは参照されません。 -f オプションは、コマンド builtin と同様に、シェル関数の検索を抑制します。 type は、引数が見つかった場合は true を返し、何も見つからなかった場合は false を返します。
ulimit [-SHacdefilmnpqrstuvx [limit]]
そのような制御を許可するシステムで、シェルとそれによって開始されたプロセスに使用可能なリソースを制御します。 -H および -S オプションは、特定のリソースにハード制限またはソフト制限を設定することを指定します。 ハード制限は、一度設定すると増やすことはできません。 ソフト制限は、ハード制限の値まで増やすことができます。 -H も -S も指定されていない場合は、ソフト制限とハード制限の両方が設定されます。 limit の値は、リソースに指定された単位の数値か、hard、soft、または unlimited の特別な値の 1 つにすることができます。これらは、それぞれ現在のハード制限、現在のソフト制限、および制限なしを表します。 limit を省略すると、-H オプションが指定されていない限り、リソースのソフト制限の現在の値が出力されます。 複数のリソースが指定されている場合、制限の名前と単位が値の前に出力されます。 その他のオプションは次のように解釈されます。
-a
すべての現在の制限が報告されます
-c
作成されるコア ファイルの最大サイズ
-d
プロセスのデータ セグメントの最大サイズ
-e
最大スケジューリング優先度 ("nice")
-f
シェルとその子によって書き込まれるファイルの最大サイズ
-i
保留中のシグナルの最大数
-l
メモリにロックできる最大サイズ
-m
常駐セットの最大サイズ
-n
開いているファイル記述子の最大数 (ほとんどのシステムでは、この値を設定できません)
-p
512 バイト ブロック単位のパイプ サイズ (設定されていない場合があります)
-q
POSIX メッセージ キューの最大バイト数
-r
リアルタイムスケジューリングの最大優先度
-s
最大スタックサイズ
-t
秒単位の最大 CPU 時間
-u
1 人のユーザーが使用できるプロセスの最大数
-v
シェルが使用できる仮想メモリーの最大量
-x
ファイルロックの最大数
limit が指定されている場合、それは指定されたリソースの新しい値です (-a オプションは表示のみです)。 オプションが指定されていない場合は、-f が想定されます。 値は 1024 バイトの増分です。ただし、秒単位の -t、512 バイト ブロック単位の -p、スケーリングされていない値の -n と -u を除きます。 無効なオプションまたは引数が指定された場合、または新しい制限の設定中にエラーが発生した場合を除き、戻りステータスは 0 です。
umask [-p] [-S] [mode]
ユーザー ファイル作成マスクはモードに設定されます。 mode が数字で始まる場合、それは 8 進数として解釈されます。 それ以外の場合は、chmod(1) で受け入れられるものと同様のシンボリック モード マスクとして解釈されます。 mode が省略された場合、マスクの現在の値が出力されます。 -S オプションを指定すると、マスクが記号形式で出力されます。 デフォルトの出力は 8 進数です。 -p オプションが指定され、mode が省略されている場合、出力は入力として再利用できる形式になります。 モードが正常に変更された場合、またはmode 引数が指定されなかった場合、戻りステータスは 0 になり、それ以外の場合は false になります。
unalias [-a] [name ...]
定義済みエイリアスのリストから各name を削除します。 -a を指定すると、すべてのエイリアス定義が削除されます。 指定された name が定義済みの別名でない限り、戻り値は true です。
unset [-fv] [name ...]
name ごとに、対応する変数または関数を削除します。 オプションが指定されていない場合、または -v オプションが指定されている場合、それぞれのname はシェル変数を参照します。 読み取り専用変数は設定解除できません。 -f を指定すると、それぞれのname がシェル関数を参照し、関数定義が削除されます。 設定されていない各変数または関数は、後続のコマンドに渡される環境から削除されます。 RANDOM、SECONDS、LINENO、HISTCMD、FUNCNAME、GROUPS、または DIRSTACK のいずれかが設定されていない場合、後でリセットされても、それらの特別なプロパティは失われます。 name が読み取り専用でない限り、終了ステータスは true です。
wait [n ...]
指定された各プロセスを待ち、その終了ステータスを返します。 各 n は、プロセスID またはジョブ仕様の場合があります。 ジョブ仕様が指定されている場合、そのジョブのパイプライン内のすべてのプロセスが待機されます。 n が指定されていない場合、現在アクティブなすべての子プロセスが待機され、戻りステータスはゼロになります。 n が存在しないプロセスまたはジョブを指定する場合、戻りステータスは 127 です。それ以外の場合、戻りステータスは、最後に待機したプロセスまたはジョブの終了ステータスです。

ブログ主)waitで待っているプロセスが外部から強制終了させられた場合、待機(ブロック)が解除される。永久に待ち続けるわけではない。

制限付きシェル (RESTRICTED SHELL)

bash が rbash という名前で開始された場合、または呼び出し時に -r オプションが指定された場合、シェルは制限されます。 制限付きシェルは、標準シェルよりも制御された環境をセットアップするために使用されます。 以下が許可されていないか実行されないことを除いて、bash と同じように動作します。

  • cd によるディレクトリの変更
  • SHELL、PATH、ENV、または BASH_ENV の値の設定または設定解除
  • / を含むコマンド名を指定する
  • への引数として / を含むファイル名を指定します。 組み込みコマンド
  • hash 組込みコマンドの -p オプションの引数にスラッシュを含むファイル名を指定する
  • 起動時にシェル環境から関数定義をインポートする
  • 起動時にシェル環境から SHELLOPTS の値を解析する
  • >、>|、<>、>&、&>、および >> リダイレクト演算子を使用した出力のリダイレクト
  • exec 組み込みコマンドを使用してシェルを別のコマンドに置き換える
  • -f および -d オプションを使用して組み込みコマンドを enable 組み込みコマンドに追加または削除する
  • enable builtin コマンドを使用して、無効なシェル組み込みコマンド を有効にする
  • コマンド組み込みコマンドに -p オプションを指定する
  • set +r または set +o limited で制限モードをオフにします。

これらの制限は、起動ファイルが読み取られた後に適用されます。

シェル スクリプトであることが判明したコマンドが実行されると (上記の「コマンドの実行」を参照)、rbash は、スクリプトを実行するために生成されたシェルの制限をオフにします。

ファイル (FILES)

/bin/bash
bash 実行可能ファイル
/etc/profile
ログインシェルに対して実行されるシステム全体の初期化ファイル
~/.bash_profile
ログイン シェル用に実行される個人用初期化ファイル
~/.bashrc
対話型シェルごとの個別の起動ファイル
~/.bash_logout
ログイン シェルの終了時に実行される個々のログイン シェル クリーンアップ ファイル
~/.inputrc
個別の readline 初期化ファイル

関連ページ