Skip to content

Instantly share code, notes, and snippets.

@emasaka
Created December 29, 2020 03:38
Show Gist options
  • Save emasaka/2575afff600bab3a714b344cf3fd74d4 to your computer and use it in GitHub Desktop.
Save emasaka/2575afff600bab3a714b344cf3fd74d4 to your computer and use it in GitHub Desktop.
これはbash-5.1にbash-5.0のリリース以降で追加された新機能の簡潔な説明です。いつもどおり、完全な説明を探しているのであればマニュアルページ(doc/bash.1)が目的の場所です。
1. Bashの新機能
a. `bind -x'は異なる編集モードやキーマップごとに異なるキーバインディングをサポートするようになりました。
b. Bashはサブシェルや`bash -c'からコマンドを実行したときにフォークの回数を最適化するよう試みます。
c. ヒアドキュメントおよびヒアストリングでは、パイプのバッファサイズより小さければ展開したドキュメントにパイプを使うようになりました。大きければ元のようにテンポラリファイルを使います。
d. 新しいローダブルの組み込みコマンドが追加されました:mktemp, accept, mkfifo, csv, cut/lcut
e. posixモードにおいて、`trap -p'はシェル起動時にSIG_IGNでSIG_DFLになっているシグナルを表示するようになりました。
f. シェルはそのときコマンドが履歴リストに保存されなくても履歴番号を展開する(例:PS1中)ようになりました
g. `read -e'は任意のファイルディスクリプターを指定して使えるようになりました(`read -u N')
h. 組み込みコマンド`select'は、内部で呼び出した組み込みコマンドreadでシグナルの割り込みが発生したときに、トラップを実行するようになりました。
i. SRANDOM:線形合同法によらない32ビットの乱数に展開される新しい変数です。getrandom / getentropyを用い、そうでなれば/dev/urandomまたはarc4randomが使えれば代替します。いずれも使えない場合には、代替の乱数生成器が用意されています。
j. shell-transpose-words:新しいキーに割り当てられるreadlineの関数です。単語の定義はshell-forward-wordなどと同じです。
k. シェルで新しくデフォルトでshell-forward-word、shell-backward-word、shell-transpose-words、shell-kill-wordのキー割り当てが追加されました。
l. Bashの起動時に変数BASH_ARGV0が設定されていると、その値が$0に設定されるようになりました。
m. `unset'がオプション引数なしで実行されたとき、引数で指定された名前が識別子と認められないため変数ではないなら、シェル関数の削除を試みるようになりました。
n. `test -N'演算子は利用できればナノ秒のタイムスタンプ粒度を用います。
o. Bashのposixモードでは、シェル関数定義の前に置かれた代入文をデフォルトモードと同じように扱うようになりました。POSIXの変更により、そうした代入が関数から戻った後に残る必要がなくなったためです(POSIXのXCU/TC2/D4/0024 [654] の解釈による)。
p. BASH_REMATCHは読み取り専用ではなくなりました。
q. wait:新しい-p VARNAMEオプション。`wait -n'(あるいは引数なしの`wait')から戻ったときに、該当PIDを変数VARNAMEに格納します。
r. パス名展開の結果のソートは、2つの文字列が等しく照合され全順序が課せされるときに、バイトごとの比較が用いられるようになりました。これはPOSIXの解釈の結果です。
s. BashでSIGINTのトラップハンドラの再帰的実行が許されるようになりました。
t. Bashで、posixモードを解除すると不明な状態になるかわりに、posixモードの設定や解除のときに状態を保存や復帰するようになりました。
u. プロセス置換がposixモードでも使えるようになりました。
v. READLINE_MARK:新しい変数。`bind -x'で割り当てられたコマンドの実行中にマークの値を保持します。
w. Bashは、シェルの起動時にブロックされたSIGCHLDを、ブロックされたシグナルから取り除きます。
x. `test -v N'で位置パラメータNがセットされているかどうかテストできるようになりました。
y. `local'は`-p'オプションを尊重し現在のコンテキストでのローカル変数の値を表示するようになりました。
z. パラメータ変形の`@a'は、値が設定されていない配列変数の属性を表示するようになりました。
aa. パラメータ変形の`@A'は、変数に属性が与えられているが値が設定されていないときに、変数の属性を設定したdeclareコマンドを表示するようになりました。
bb. `declare'と`local'に-Iオプションが加わりました。前のスコープにある同名の変数の属性と値を受け継ぎます。
cc. -c commandから実行したときに、`jobs'が完了したジョブのステータスを報告するようになりました。
dd. パラーメータ変形に`U'、`u'、`L'が加わりました。それぞれ、大文字に変換、最初の文字を大文字に変換、小文字に変換します。
ee. PROMPT_COMMAND:配列変数にできるようになりました。各要素には、文字列のPROMPT_COMMAND変数と同じように実行できるコマンドが入ります。
ff. `ulimit'に-Rオプションが加わりました。RLIMIT_RTTIME資源を報告または設定します。
gg. 連想配列で、キー・バリューのペアのリストによる複合代入が使えるようになりました。[key]=valueの形式でない複合代入は、キー・バリューによる代入と仮定されます。キーがないか空の場合はエラーとなり、値がない場合はNULLとして扱われます。2種類の代入形式は混ぜられません。
hh. 新しいパラメータ変形`K'は、連想配列をキー・バリューのペアとして表示します。
ii. 履歴のsyslogへのかきこみにおいて、syslogの最大長より長いメッッセージを、連番つきの複数のメッセージとして書き込むようになりました。
jj. SECONDSとRANDOMは、通常の整数変数として、算術式展開で代入できるようになりました。LINENOは整数変数ではありません。
kk. Bashは、組み込みコマンド`fc'からコマンドを実行していてDEBUGトラップを実行するときに、一時的にverboseオプションを抑制します。
ll. `wait -n'には引数としてジョブ名のリストを指定できるようになりました。リストの最初のものの状態が変わるのを待ちます。
mm. 連想配列の実装において、ハッシュテーブルのサイズを挿入パターンにもとづき動的に増大させられるようになりました。
nn. HISTFILEは制限されたシェルでは読み取り専用になりました。
oo. bashのmallocは、64ビットシステムでは16バイトアラインメントでメモリを返すようになりました。
pp. 組み込みコマンドhashがハッシュされたファイル名をポータブルにリスト表示するとき、テーブルが空なら何も表示しません。
qq. GLOBIGNOREでは`.'と`..'を端末でのパス名の一部として無視するようになりました。
rr. Bashは適切な環境のもとでは、関数内の最後のコマンドのフォークを省く最適化を試みます。
ss. グロブ展開のコードでは、マルチバイト文字がなくても照合要素のチェックにfnmatch(3)を使うようになりました(利用できれば)。
tt. 組み込みコマンドの`fg'と`bg'は、コマンド置換の中で親シェルから引継がれたジョブの再開を求められたときには、エラーを返すようになりました。
uu. シェルは終了時にすべてのFIFOを、読み出しているプロセスが終了したかどうかにかかわらず、削除を試みるようになりました。
vv. 新しいローダブルの組み込みコマンドがコントリビュートされました:asort。
2. Readlineの新機能
a. 2回連続で補完を試みて、最初にはマッチしなかったものがマッチした場合は、treat it as a 新しい補完の試みとして扱い、マッチを必要に応じて挿入します。
and insert a match as appropriate.
b. Bracketed Pasteモードがより多くの場所で使えるようになりました:インクリメンタル検索の文字列、viの上書きモード、文字検索、数値引数の読み取り。
c. Readlineは、端末が1行しかない場合には、自動的に水平スクロールに切り替わります。
d. 特定のreadline関数に割り当てられたすべてのキーシーケンスの取消しは、複数キーからなるシーケンスのキーマップに及ぶようになりました。
e. rl-clear-display:キーに割り当てられる新しいコマンドで、画面と、可能であればスクロールバックのバッファをクリアします(emacsモードのデフォルトではM-C-lに割り当てられます)。
f. アクティブなマークとフェイスの新機能:有効にすると、Bracketed Pasteで挿入されたテキスト(`アクティブなリージョン')と、インクリメンタルおよび非インクリメンタルの履歴検索で見つかったテキストをハイライトします。これはBracketed Pasteに結びついていて、Bracketed Pasteをオフにすることで無効になります。
g. Readlineでいくつかのコマンドにマークのセットが追加されました。
h. Bracketed Pasteモードがデフォルトで有効になりました。
i. Readlineは、行バッファ内の移動で文字の始まりと終わりを識別するのに、UTF-8文字の正規構造をより利用するようになりました。
j. キーに割り当てられるコマンドoperate-and-get-next(とそのデフォルトの割り当て)は、bash固有の追加機能から、readlineの一部になりました。
k. シグナルのクリーンアップのコードは、SIGINT後の処理の間、SIGINTをブロックするようになりました。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment