Skip to content

Instantly share code, notes, and snippets.

@emasaka
Created October 5, 2022 11:02
Show Gist options
  • Save emasaka/599a66bd9129b8c63122c0448d1eebea to your computer and use it in GitHub Desktop.
Save emasaka/599a66bd9129b8c63122c0448d1eebea to your computer and use it in GitHub Desktop.
これはbash-5.2にbash-5.1のリリース以降で追加された新機能の簡潔な説明です。いつもどおり、完全な説明を探しているのであればマニュアルページ(doc/bash.1)が目的の場所です。
1. Bashの新機能
a. bashの mallocは16バイト境界でアラインされたメモリを返します。
b. 組込みコマンドreadのタイムアウトのために、新しい内部のタイマーフレームワークが使われています。
c. コマンド置換をパースするコードは、パーサーを再帰的に呼び出してパースされたコマンドからコマンド文字列を再構成するよう書き直されました。これによりよりよい文法チェックと、早期のエラー検出が可能になります。これにともない、コマンド置換のパースが完了して読み込むべきヒアドキュメントが残っている場合に、シェルは警告メッセージを表示して、ヒアドキュメントの中身を現在の入力ストリームから読み込みます。
d. 組込みコマンド `ulimit' は、すべてのオプションと引数がパースされたあとに残ったオペランドを、オプションで指定された最後のコマンドの引数として扱うようになりました。これは POSIX との互換性のためです。
e. ヒアドキュメントのパースでは、ヒアドキュメントの中身を読み込むときに、$'...' と $"..." のクォートを扱うようになりました。
f. キーに割り当てられる readline のコマンド `shell-expand-line' と `history-and-alias-expand-line' は、$'...' と $"..." のクォートを理解するようになりました。
g. キーに割り当てられる readline のコマンド `spell-correct-word' が新しく加わりました。現在の単語のスペル修正を行ないます。
h. 組込みコマンド `unset'は引数を、添字のパースや展開をせずに配列の添字として扱おうと試みるようになりました。これは `assoc_expand_once' が設定されていない場合でもです。
i. config-top.hで$BASH_LOADABLES_PATHのデフォルト値が用意されました。
j. 連想配列への代入や、参照の一部の例 (例: `test -v') で、キーとして `@' と `*' が使えるようになりました。
k. Bashはインデックスによる配列の添字を、シェルの構文や単語展開を実行するとき一度だけ展開を試みるようになりました。
l. 組込みコマンド `unset' で添字に `@' や `*' を指定したときに、連想配列の全体を削除するのではなく (これはいまでも `unset 配列名' によりできます)、キーと値を削除します。インデックスによる配列の場合は、配列自体ではなくすべての要素を削除します (`A=()' のように)。
m. 追加の組み込みコマンド (printf/test/read/wait) は、array_expand_once が設定されている場合に、配列の添字をパースしないようにうまくやります。
n. 新しい READLINE_ARGUMENT 変数には `bind -x' で割り当てられた readline コマンドへの数値の引き数が設定されます。
o. 新しいシェルオプション `varredir_close' により、{var}<fn やその他のスタイルで変数に代入するリダイレクションで開かれたファイル・ディスクリプター (組込みコマンド `exec' の引数の場合を除く) を bsh が自動的にクローズします。
p. 特殊パラメータ `$0' は、$BASH_ENV で指定されているものなどどんな (非対話的) 起動ファイルが動いても、そのスクリプトの名前がセットされるようになりました。
q. 組み込みコマンド `enable' は、`enable 名前' (オプションなし) で存在しない組込みコマンドを有効にしようとしたときに、デフォルトの検索パスをもとにロード可能な組込みコマンドをロードしようとします。
r. 組込みコマンド `printf' に新しい書式指定子 %Q が加わりました。%q と同じような動作ですが、元のクォート前の引数に精度指定子を適用してから、クォートして結果を出力します。
s. 新しい `noexpand_translations' オプション (訳注:正しくは noexpand_translation と思われる) は、$"..." を変換された結果がシングルクォートされるかどうかを制御します。
t. 新しいパラメータ変換演算子:@k。@K と同じようなものですが、単語へ分割したあとに、結果を別々の単語に展開します。
u. 配列のもう1つの実装を `configure' で選べます (新しい configure --enable-alt-array-implementation オプションを使います)。メモリ使用量よりアクセススピードを最適化します
v. [N]<&WORD- や [N]>&WORD- のリダイレクトで WORD が空文字に展開されるとき、リダイレクトを [N]<&- や [N]>&- として扱い、ファイル・ディスクリプター N (デフォルトは 0) をクローズします。
w. 不正なパラメータ変換演算子は不正な単語展開となり、非対話的シェルでは致命的なエラーを起こすようになりました。
x. 新しいシェルオプション:patsub_replacement。有効にすると、パターンの置換の展開において、置換後文字列中の `&' がパターンにマッチした部分の文字列に置換されます。バックスラッシュによって `&' がエスケープされて文字 `&' になります。
y. `command -p' はもはや指定されたコマンドをハッシュテーブルから探しません。
z. `configure' の新しい `--enable-translatable-strings' オプションは、コンパイル時に $"..." のサポートを許可するかどうか指定します。
aa. 新しいシェルオプション `globskipdots' は、パス名展開が明示的にマッチさせたとき以外は `.' や `..' を返さないようにします。これはデフォルトで有効です。
bb. 配列 (declare -n ref='v[@]' ; echo $ref) の `@' and `*' での参照を nameref 変数が指しているとき、set -u が有効で元の配列 (v) が設定されていない場合に、シェルが終了しないようになりました。
cc. 新しいキーに割り当てられる readline のコマンド:`vi-edit-and-execute-command'。
dd. POSIX モードにおいて、組込みコマンド `printf' は長さ修飾子 `L' をチェックする。不動小数点数の変換指定子に対して、あれば long double とし、なければ double とする。
ee. グロブを展開する補完でシェルオプション `globstar' を考慮するようになりました。
ff. `suspend -f' は、ジョブコントロールが有効になっていないときでも、サスペンドを強行するようになりました。
gg. `local -' に相当する `declare -' はありません。`local -p' の出力には必ず `local -' を使ってください。
2. Readlineの新機能
a. アプリケーションのコードから使える HS_HISTORY_VERSION に履歴ライブラリーのバージョン番号が格納されるようになりました。
b. 履歴展開、通常は履歴展開を抑制する文字列を含むかもしれない複数の履歴展開 (例:`abc!$!$') をより理解するようになりました。
c. readline のタイムアウトに関する新しいフレームワークが用意されました。タイムアウトを設定したりタイムアウトまでの残り時間を問い合わせたりする新しい公開関数や、readline がタイムアウトに達したときに発火するフック関数などがあります。タイムアウトを示す新しい状態値があります。
d. page-up キーと page-down キーのキーシーケンスをそれぞれ history-search-backward と history-search-forward に termcap から自動的に割り当てます。
e. 新しいキーに割り当てられるコマンド `fetch-history' が用意されました。数値の引数に対応する履歴のエントリを取り出します。負の引数は、履歴の最後から遡ってカウントします。
f. `vi-undo' はキーに割り当てられるコマンドになりました。
g. 新しいオプション:`enable-active-region'。アクティブリージョンとブラケットペーストの制御を分離します。ブラケットペーストとデフォルト値は同じで、ブラケットペーストが有効だとアクティブリージョンも有効になります。このオプションにより、ブラケットペーストをを有効にしたままアクティブリージョンをオフにできるようになりました。
h. rl_completer_word_break_characters は、rl_basic_word_break_characters と同様に `const char *' になりました。
i. readline は $LS_COLORS からカスタムの拡張子 (*.readline-colored-completion-prefix) を見て、`colored-completion-prefix' が設定されているときの補完で表示される共通先頭部分のデフォルトの色として使います。
j. 新しい bind から設定できる 2 つの文字列変数:active-region-start-color と active-region-end-color。前者はアクティブリージョンを表示するときの色づけを開始し、後者はそれを終了します。設定されると、これらが端末の強調モードのかわりに使われます。
k. 新しい readline の状態 (RL_STATE_EOF) と、アプリケーションから見える変数 (rl_eof_found)。readline の読み込みの EOF を deprep-terminal フックの呼び出しの前にアプリケーションが検出できるようにします。
l. 新しいコンフィグレーションのオプション:--with-shared-termcap-library。readline のシェアードライブラリから termcap (または curses/ncurses/termlib) のシェアードライブラリをリンクするよう強制します。アプリケーションからリンクする必要がなくなります。
m. readline は、呼び出されるたびにロケール設定 (LC_ALL/LC_CTYPE/LANG) の変更をチェックし、ロケールが変更されればそれにあわせてロケール固有の表示やキーバインディングの変数を変更するようになりました。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment