組み込み機能が利用可能なbashのバージョンをどのように理解できますか?

組み込み機能が利用可能なbashのバージョンをどのように理解できますか?

bash特定の組み込み機能の特定のバージョンが利用可能であることをコマンドラインから確認できますか?各バージョンのリリースノートを検索する必要がありますか、それとも簡単な方法がありますか?

答え1

機能が追加されたバージョンをBashに尋ねる方法がないと思います。これをテストするために私が考えることができる最も近い方法は、次のものを使用することですBASH_COMPATcompatXYオプション、組み込みの可用性は含まれません(一部が組み込みの可用性に影響を与えても)。行動):

compat31

=~設定されている場合、Bashは条件コマンドのAND演算子を使用すると、条件コマンド演算子の引用引数とロケール固有の文字列比較に関して動作をバージョン3.1に変更します。 bash-4.1より前のBashバージョンはASCIIの組み合わせとstrcmp(3)を使用し、bash-4.1以降のバージョンは現在のロケールの組み合わせ順序とstrcoll(3)を使用します。[[<>

compat32

[[設定されている場合、Bashは<バージョン3.2(前のトピックを参照)で条件付きコマンドと演算子をロケール固有の文字列比較に使用するときの動作を変更し、>コマンドリストの効果を中断します。 Bash バージョン 3.2 以降では、割り込みにより終了した後、リストの次のコマンドを続行します。

compat40

[[設定されている場合、Bashは<バージョン4.0のロケール固有の文字列比較の条件付きコマンドと演算子を使用するときの動作を変更し>(説明を参照compat31)、コマンドリストの効果を中止します。 Bash 4.0以降では、シェルが割り込みを受け取ったかのようにリストを割り込みます。以前のバージョンでは、リストの次のコマンドで引き続き実行されます。

compat41

設定されている場合、Bashは二重引用符で囲まれた引数拡張の一重引用符をPOSIXモードの特殊文字として扱います。一重引用符は一致する必要があり(偶数)、一重引用符の間の文字は引用符と見なされます。これはバージョン4.1より前のPOSIXモードの動作でした。デフォルトの Bash 動作は以前のバージョンと一貫して保持されます。

compat42

設定されている場合、Bash はパターン置換単語拡張で置換文字列を処理するために引用符の削除を使用しません。

compat43

設定されている場合、Bashは引用符付きの複合配列割り当てを引数として使用しようとすると警告メッセージを出力せず、declare単語拡張エラーは現在のコマンドが失敗するような致命的でないエラーを生成します(デフォルトの動作は次のような致命的なエラーを作成します。です)。シェルが終了するようにし、シェル関数が実行されるとループ状態はリセットされません(これは呼び出し側コンテキストのループに影響を与えるためにシェル関数で中断または続行を許可します)。

compat44

設定されている場合、Bashは拡張デバッグモードが有効かどうかにかかわらず、位置引数をBASH_ARGV使用する前に保存します。BASH_ARGC

実際には、これに対するユースケースはあまりありません。機能の可用性に関するバージョン情報を確認する場合の一般的なアドバイスは、機能(この場合は組み込み機能)の可用性を直接確認することです。結局、この機能があるバージョンでもコンパイル時に無効になることがあります。 。

たとえば、

$ for s in bash /bin/bash; do
 for b in compopt help; do
  "$s" -c 'echo "$1" is $([[ $(type "$1" 2>/dev/null) =~ "shell builtin" ]] || echo not) a builtin in "$BASH_VERSION"' _ $b;
 done;
done
compopt is a builtin in 5.0.7(1)-release
help is a builtin in 5.0.7(1)-release
compopt is not a builtin in 3.2.57(1)-release
help is a builtin in 3.2.57(1)-release

関連情報