Skip to content

Instantly share code, notes, and snippets.

@emasaka
Created July 18, 2025 04:04
Show Gist options
  • Save emasaka/b41ab5e2cf29c0e961fe8fc1919eb344 to your computer and use it in GitHub Desktop.
Save emasaka/b41ab5e2cf29c0e961fe8fc1919eb344 to your computer and use it in GitHub Desktop.
これはbash-5.2にbash-5.2のリリース以降で追加された新機能の簡潔な説明です。いつもどおり、完全な説明を探しているのであればマニュアルページ(doc/bash.1)が目的の場所です。
1. Bashの新機能
a. スクリプトファイルとして与えられた引数がバイナリファイルかどうか確認するときには、最初の行が`#!'で始まっていれば、最初の2行をチェックします。
b. bashは単語補完でユーザーが指定したクォートを保持するのに、再度クォートするよりよい働きをします。
c. bashは、`fi'のない`if'のように終了していない複合コマンドについて、エラーメッセージで開始行を報告します。
d. POSIXの要件に従って、組込みコマンド`jobs'を実行してジョブのリストからジョブを削除するよう実装しました。
(訳注:`e.'は原文でも抜けている)
f. 補完のコマンドを実行しているときには、readlineのではなくbashのシグナルコマンドを 呼び出します。
g. [[ で使われた正規表現のコンパイルに失敗したときにはエラーメッセージを表示します。
h. 組み込みコマンド`umask'には、POSIXに準拠するよう機能が追加されました。
i. `type -a -P'は、ハッシュ化されたパス名と、$PATHの検索結果との、両方を報告します。
j. `trap'の新しい-Pオプションは、引数で指定したシグナルそれぞれについてトラップの動作を表示します。
k. 組み込みコマンド`command'を、宣言の組み込みコマンド(例:`declare')の前に置いたとき、宣言の組み込みコマンドのパースにおいて、特別な代入文を保持します。これは新しいPOSIXの要件です。
l. `printf'では、%qと%Qにシングルクォートさせるために代替形式(alternate form)を使います。
m. `printf'はマルチバイトのロケールにおいて、%ls (%S) と %lc (%C)を、それぞれワイド文字列およびワイド文字を参照するものと解釈するようになりました。
n. shellのコンパイル時に、patsub_replacementオプションに異なるデフォルト値を設定できます。
o. trapコマンドや、`bind -x' コマンド、プログラム補完の間、ウィンドウのサイズの変化をチェックします。
p. $PATHが空のときに、"."と同じものとして扱います。
p. 新しいロード可能な組み込みコマンド:kv、strptime
(訳注:`p.'は原文でも重複している)
q. GLOBSORT: パス名展開の結果のソート方法 (name、size、blocks、mtime、atime、ctime、numeric、none) および昇順・降順を指定する新しい変数
r. `compgen'の新しいオプション:-V varname。指定すると、生成された補完内容を、標準出力に出力する代わりにVARNAMEに格納する。
s. 新しい形式のコマンド置換:${ command; } または ${|command;} によって、COMMANDの出力を、子プロセスをフォークしてパイプを使うことなく捕捉できる。
t. array_expand_once:assoc_expand_onceを置き換える新しいshoptオプション
u. complete / compoptの新しいオプション:fullquote。rl_full_quoting_desiredがセットされ、すべての補完候補がファイル名のようにクォートされます。
v. $TIMEFORMATにおいて、コマンド実行時点はこれまでの3桁から6桁の精度が可能になりました。
w. BASH_MONOSECONDS:新しい動的な変数で、利用可能であればシステムのmonotonic clockの値を返す。
x. BASH_TRAPSIG:新しい変数で、トラップが実行されている間、シグナルの番号が設定されます。
y. checkwinsizeオプションが、インタラクティブなシェルから実行されたサブシェルのコマンドで使われるようにできます。
z. posixモードで、testコマンドの2項演算子の<と>は、文字列を現在のロケールで比較します。
aa. bind -xの新しいキーバインディングの構文:キーシーケンスとコマンド文字列を空白で区切ります。これを使うには、コマンド文字列をダブルクォートする必要があります。コマンド文字列の中では異なるクォート方法を使います。
bb. 可能であれば、`bind -x'でキーシーケンスに割り当てられたコマンドは、新しいキーバインディングの構文で表示します。
cc. `read'の新しい`-E'オプションでは、readlineでデフォルトのbashの補完(プログラム補完を含む)を使います。
dd. キー割り当てできるreadlineの新しいコマンド名:`bash-vi-complete'。
ee. 組み込みコマンドtest behavior when parsing 括弧による部分式と4つ以上の引数が与えられたときのパースの挙動が変わりました。閉じ括弧をスキャンして、括弧の間の引数が4つ以下の場合には、posixtest()を呼びます。この挙動は、シェルの互換性レベルに応じたcoreutilsのテストとの互換性のために加えられました。こうした式には多義性が残っています。
ff. MULTIPLE_COPROCSはデフォルトで有効になりました。
gg. 組み込みコマンド`bind'は、-pまたは-Pの跡に他のオプションではない引数を付け加えると、キーに割り当てられるコマンドの名前と解釈し、出力をその名前で絞り込みます。
hh. bashは、シェルが`su'または`-su'という名前の場合は、$BASHとしてログインシェルを使うようになりました。
ii. インタラクティブシェルがトラップを実行している場合、その瞬間はシェルはインタラクティブではありませんが、ジョブの通知を表示するようになりました。
jj. プログラム補完では、補完関数がよく使われるように終了ステータス124を返したあと、新しい補完仕様(compspec)を読み直せるようになりました。
kk. . / sourceの新しいオプション-p PATHを指定すると、ファイルを探すのに$PATHの代わりにPATH引数を使います。
ll. ドキュメントは大幅に更新されました。
mm. `wait -n'は終了してユーザーにすでに通知されているプロセス置換やジョブを返せるようになりました(オプションなしの`wait'のように)。
nn. `wait -n'はposixモードでは、終了した子プロセスについてジョブのテーブルやリストからジョブを削除します。
oo. 組み込みコマンド`wait'のプロセス置換に関する挙動を、ドキュメントに合わせて変更しました。
pp. bashがBASH_SOURCEにフルパスを入れるようにする新しいshoptオプション`bash_source_fullpath'と、そのデフォルト値をコンフィギュレーション時にセットする方法があります。
qq. posixモードでは、新版のPOSIXが指定する場面でジョブの通知が発生するようになりました(そう指定されるようになったため)。
rr. インタラクティブなシェルは、sourceでスクリプトを読み込んでいる間はジョブの通知を表示しません。
ss. パーサーは、コマンドをパースしようとしてコマンドが終わる前にEOFに遭遇したときに、以前より多くの情報を出力します。
tt. posixモードでは、関数名はシェルの識別子として有効である必要はなくなりました。
uu. `exit'がトラップの中で終了ステータスを指定せずに実行された場合に、トラップ処理前の$?の値を使います。ただし、トラップのトップレベルで実行されてトラップを終了させる場合に限ります(つまり、サブシェルでない場合)。これは、POSIX interp 1602の仕様によるものです。
vv. 新しいロード可能な組み込みコマンド`fltexpr'があります。`let'と同様に浮動小数点の計算をします。
ww. Makefileで、`install-strip'と`strip'がクロスコンパイルに対応しました。
2. Readlineの新機能
a. プロンプトなしでreadlineが空行を読み込んだときには、改行を出力します。
b. 履歴のライブラリーは、履歴を書き込むときにmmapが失敗した場合は標準入出力に切り替えます。
c. 新しい変数`search-ignore-case'を設定すると、readlineの履歴の検索が、インクリメンタル検索およびインクリメンタルでない検索において大文字小文字を区別しないようになります。
d. rl_full_quoting_desired:アプリケーションで設定できる新しい変数で、補完候補がファイル名であればすべてクォートするようになります。
e. rl_macro_display_hook:アプリケーションで設定できる新しい関数ポインターで、readlineがマクロを実行するかわりにマクロの値自体を表示するときに使われます。
f. rl_reparse_colors:アプリケーションで呼び出せる新しい関数で、$LS_COLORSを再パースします(おそらくユーザーの変更後)。
g. rl_completion_rewrite_hook:アプリケーションで設定できる新しい関数ポインターで、ファイルシステムから得られたパス名と比較する前に、補完される単語を修正するために呼び出されます。
h. execute-named-command:キー割り当てできる新しいコマンドで、標準入力からreadlineのコマンド名を読み取り、実行します。emacsモードではデフォルトでM-xに割り当てられています。
i. インクリメンタル検索およびインクリメンタルでない検索において、検索文字列中で^V/^Q(あるいは前者の場合、quoted-insertが割り当てられたもの)によって文字をクォートできるようになりました。
j. 新しいrl_print_keybinding関数は、指定されたキー割り当てできる関数の名前から、キーバンドを表示します。
k. ドキュメントは大幅に更新されました。
l. 設定可能な新しい変数`force-meta-prefix'。convert-metaに頼る代わりに、キーバインディングで"\M-"が使われたときに、ESCをメタプレフィックスとして使うようにする。
m. `readline-colored-completion-prefix'のデフォルト値には先頭の`.'がなくなりました。元のレポートは誤解にもとづいていました。
n. キー割り当てでできる新しいコマンド`export-completions'。単語に対する可能な補完候補を、定義された形式で標準出力に書きます。
o. readlineはSIGCONTの後に画面の大きさについての知識をリセットできます。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment