Skip to content

Instantly share code, notes, and snippets.

@emasaka
Last active January 11, 2019 14:25
Show Gist options
  • Save emasaka/041fb4ac3374f38e1162d8a864526ff1 to your computer and use it in GitHub Desktop.
Save emasaka/041fb4ac3374f38e1162d8a864526ff1 to your computer and use it in GitHub Desktop.
bash 5.0のNEWSの私訳
これはbash-5.0にbash-4.4のリリースから追加された新機能の簡潔な説明です。いつもどおり、完全な説明を探しているのであればマニュアルページ(doc/bash.1)が目的の場所です。
1. Bashの新機能
a. 組み込みコマンド`wait'は、最後に作られたプロセス置換の実行を待つようになりました。
b. Unix紀元(Epoch)から秒数に展開される変数EPOCHSECONDSがあります。
c. Unix紀元(Epoch)からのマイクロ秒数に展開される変数EPOCHREALTIMEがあります。
d. 組み込みコマンドとしてロードできる新しいコマンド: rm、stat、fdflags(訳注:exampleディレクトリにあるサンプル)。
e. BASH_ARGV0:展開すると$0の値となり、代入すると$0を設定する新しい変数。
f. キーに割り当てられるreadlineの関数shell-expand-lineに数値の引き数が与えられると、クォートの除去を実行せず、コマンド置換やプロセス置換を抑制します。
g. `history -d'は負の引数を認識します:履歴リストの末尾からのオフセットです。
h. 予約語`coproc'の`name'引数は、単語展開を受けるようになりました。これにより、ループでユニークなコプロセスを作れます。
i. 関数内でnamerefの名前解決のループは、グローバルスコープでの名前の変数に解決されるようになりました。
j. 組み込みコマンド`wait'に`-f'オプションが追加されました。指定したジョブやプロセスが状態が変化するのを待つ代わりに、終了するまで待つことを表します。
k. config-top.hの定義により、制限付きシェルが起動時の環境を無視して$PATHに静的な値を使うようにできます。
l. プロセス置換は、コマンド置換と同様に、`v'オプションを継承しません。
m. 対話的でないシェルのジョブコントロールで、フォアグラウンドジョブがSIGINTにより死亡したことの検出が有効になっていれば、SIGNITを受け取ったときにそう動作します。
n. SIGCHLDのトラップは、子プロセスがそれぞれ終了するとき、シェルがPosixモードでジョブコントロールが有効でないときでも、1度だけ実行されます。
o. 新しいshoptオプション:localvar_inherit。設定すると、ローカル変数は、直前のスコープにある同じ名前の変数の値を継承します。
p. `bind -r'は、キーにNULLに割り当てる前に、キーシーケンスが割り当てられているかどうかをチェックするようになりました。複数キーからなるシーケンスのキーマップを作るのを防ぎます。
q. 行編集の`operate-and-get-next'コマンドへの数値の引き数は、どの履歴エントリを使うか指定します。
r. 位置パラメータは、シェルの起動ファイルが走る前に設定されます。そのため、起動ファイルでも$@を使えます。
s. 継承されたOLDPWDがディレクトリかどうかシェルがチェックするのを無効にするよう指定するコンパイル時オプションがあります。
t. 組み込みコマンド`history'では、`-d start-end'によって履歴エントリの範囲を削除できるようになりました。
u. キーに割り当てられるreadlineのコマンド`vi-edit-and-execute-command'は、編集した内容からコマンドを実行した後で、readlineをviの挿入モードに戻すようになりました。
v. コマンドの補完コードは、readlineの変数completion-ignore-case variableが設定されると、エイリアスとシェル関数の名前に大文字と小文字は区別しないでマッチするようになりました。
w. 新しいシェルオプション`assoc_expand_once'があります。連想配列の添字を一度だけ展開しようと試みます。
x. シェルは拡張デバッグモードが有効なときにだけ起動時にBASH_ARGVとBASH_ARGCを設定します。以前の、これらを無条件で設定する動作は、シェルの互換性のオプションにより利用できます。
y. 組み込みコマンド`umask'は、8進数の777より大きいモードやマスクを受け付けるようになりました。
z. 組み込みコマンド`times'は、小数点を表示するときに現在のロケールを尊重するようになりました。
aa. 履歴をsyslogに送る機能を実行時に有効にしたり無効にしたりするオプションが新しく加えられました。デフォルトで無効で、ドキュメントに記載されていません。
bb. 互換性レベルが44以下でなければ、変数の属性を変更する特殊な組み込みコマンドの前に置かれた変数代入が、呼び出し元環境に逆伝播しないようになりました。
cc. ビルド時に、config-top.hに$HISTSIZEのデフォルト値を設定できます。
dd. 組み込みコマンド`complete'に、補完に行の初期文字列を与える-Iオプションを指定できるようになりました。
ee. bashのmallocは、128Kバイトより大きい要求を満たすために、初期状態でmmapを使うようになりました(可能であれば)。freeはカーネルにページを返すためにmfreeを使えます。
ff. すでにドキュメントに書かれているとおり、デバッグモード以外では、シェルは起動時に自動的にBASH_ARGCとBASH_ARGVを設定しません。しかし、デバッグモードを有効にしていなくても、スクリプトがトップレベルでこれらを参照していれば、動的に作成します。
gg. localvar_inheritオプションは、異なる種類の変数(例:インデックスによる配列と連想配列)であれば値を継承しようとしません
hh. `globasciiranges'オプションがデフォルトで有効になりました。コンフィギュレーション時に、デフォルトでオフに設定できます。
ii. 連想配列とインデックスによる配列では、単独の空白に一致する添字を受け付けるようになりました。
jj. `checkwinsize'はデフォルトで有効になりました。
kk. shoptオプションの`localvar_unset'が公開され、ドキュメントに載りました。
ll. shoptオプションの`progcomp_alias'が公開され、ドキュメントに載りました。
mm. シグナル名を処理するコードでは、SIGRTMAXまでの`SIGRTMIN+n'を使えるようになりました。
nn. 組み込みコマンドとしてロードできる新しい`seq' コマンドがあります(訳注:exampleディレクトリにあるサンプル)。
oo. トラップの実行は、(内部の)`eval'の呼び出しの最大を尊重するようになりました。トラップは`eval'のように実行されると考えられているからです。
pp. 変数$_は、フォークするコマンドを実行しても変わりません。
qq. 組み込みコマンド`kill'は、対象のアプリケーションが対応していなくても、-sSIGNAMEと-nSIGNUMをサポートするようになりました。
rr. POSIXモードで`shift_verbose'オプションを使えるようになりました。
2. Readlineの新機能
a. インクリメンタルでないviモードの検索(`N'、`n')で、Posixで規定されたシェルのパターンで検索できるようになりました(可能であればfnmatch(3)を使う)。
b. キーに割り当てられるコマンドに新しく`next-screen-line' and `previous-screen-line'があります。カーソルを物理行のそれぞれ次と前の行の同じカラムに移動します。
c. デフォルトでcontrol-矢印キーの組合せが割り当てられています。
d. `quoted-insert'への負の引数(-N)は、続くN文字をquoted-insertで入力することを意味します。
e. 新しい公開関数:rl_check_signals()。readlineがカスタマイズされた読み込み関数からの入力を待っている間にキャッチしたシグナルにアプリケーションが反応できるようになります。
f. inputrcファイルで、readlineのバージョンによる条件を使えるようになりました。フルセットの算術比較演算も使えます。
g. inputrcファイルで変数を比較する単純な機能を使えるようになりました。使える演算子は等号と不等号です。文字列変数は値で比較されます。論理変数`on'と`off'のどちらかで比較されます。変数名と演算子の間は空白で区切られます。
h. 履歴展開ライブラリは、コマンド置換とプロセス置換、グロブ展開に対応するようになりました。単語のどこに現れてもかまいません。
i. 履歴ライブラリには、内部のクォート状態をアプリケーションから設定できる新しい変数があります。これにより、クォート状態を前の行から継承できます。
j. readlineは、アプリケーションが定義するキーマップの名前に対応しました。これには、新しい公開関数rl_set_keymap_name()を使います。
k. "Insert"キー(あれば)により、上書きモードに移るようになりました。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment