Skip to content

Instantly share code, notes, and snippets.

@emasaka
Last active March 16, 2018 03:49
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save emasaka/7df67a851a719d0f9d0478b8ed8c4d1e to your computer and use it in GitHub Desktop.
Save emasaka/7df67a851a719d0f9d0478b8ed8c4d1e to your computer and use it in GitHub Desktop.
bash 4.4のNEWSの私訳
これはbash-4.3のリリース以降bash-4.4に追加された新機能の簡潔な説明です。
いつもどおり、完全な説明を探しているならマニュアルページ (doc/bash.1)
が適切です。
1. Bashの新機能
a. #defineでの設定項目として、シェルが-pオプションなしでsetuidされて
動作していて実uidへのsetupdが失敗したときにシェルが終了するよう設
定できるようになりました。
b. ほかのシェルと同じように、コマンド置換やプロセス置換が終了したとき
に`-v'オプションがオフになるように変更しました。
c. シェルのオプション`checkhash'のデフォルト値をコンパイル時に#define
で設定できるようになりました。
d. 組み込みコマンド`mapfile'に、レコード区切りとして任意の文字を指定
する-dオプションが加わりました。-tオプションは、-dで設定された区切
り文字を削除します。
e. `eval'を再帰呼び出しする入れ子の最大数をconfig-top.hで設定できるよ
うになりました。デフォルトでは制限なしです。
f. declareおよび類似組み込みコマンドの`-p'オプションは、指定した変数
の属性を表示します。その変数に値が設定されていない(unsetされてい
る)場合でも同様です。
g. `source'を再帰呼び出しする入れ子の最大数をconfig-top.hで設定できる
ようになりました。デフォルトでは制限なしです。
h. すべての組み込みコマンドは`--help'オプションを認識し、使用方法の
サマリーを出力します。
i. bashは、`/'と`='を含む関数名のエクスポートを許可しません。
j. 組み込みコマンド`ulimit'に-k(kqueueの数)オプションと-P(ptyの数)
オプションが加わりました。
k. シェルは`time ; ほかのコマンド'という空のコマンドを許容するように
なりました。
l. configureで新しく、環境変数から関数をインポートする
`--enable-function-import'オプションが加わりました。デフォルトでイ
ンポートは有効です。
m. `printf -v var ""'は`var=""'と同様に変数`var'に空文字を設定するよ
うになりました。
n. GLOBIGNORE変数、単語のパターン置換、プログラム補完の候補のフィルタ
リングは、`nocasematch'の値を尊重するようになりました。
o. ${parameter@指定}で`parameter'の値を変換する一連の演算子が使えるよ
うになりました。
p. bashは、`declare'の引数で指定された代入文の右辺の変数が複合代入の
形式のとき(例:w='(word)' ; declare foo=$w)には複合代入を実行し
ないようになりました。複合代入は、変数がすでに配列として宣言されて
いるときにだけ警句付きで認められます。
q. 組み込みコマンドdeclareは、配列変数をクォートされた複合代入の文法
で表示しないようになりました。入力として再利用したときに警告が表示
されますし、必要ないからです。
r. &&や||の右辺の実行は、必要がなければフォークしないようになりました。
s. 組み込みコマンド`local'では引数として`-'を指定できるようになりまし
た。この変数は保存されて、シェルオプションを各1文字で表す値が設定
され、関数が終了すると元の値に戻ります。
t. `complete'と`compgen'には`-o nosort'オプションが追加されました。
readlineに補完候補をソートしないよう指定します。
u. bashは、最後のプロセス置換が$!に対応するときには、終了を待つことを
許すようになりました。
v. 組み込み変数`unset'は、配列ではない変数に添字`0'を指定したときに、
その変数を削除します。${var[0]}を参照したときに合わせました。
w. ほかのシェルと同様に、`set -i'は有効ではなくなりました。
x. BASH_SUBSHELLは、プロセス置換やパイプラインのグループコマンドでも
更新されるようになりました。終了時のトラップでも利用できます。
y. bashは、GNU Emacsのシェルウィンドウで動いているかどうかを判別する
のに$EMACSと同様に$INSIDE_EMACSもチェックするようになりました。
z. bashはループ中の組み込みではないコマンドの動作中に受け取ったSIGINT
を処理するようになりました。慣習的には組み込みコマンドは処理されて
いました。トラップハンドラを実行しループから脱出します。
aa. 新しい変数EXECIGNORE。コマンドを探すときに無視するファイル名のパター
ンをコロンで区切ったリストです。
bb. エイリアスの値がシェルのメタ文字で終わる場合、次のトークンに「貼り
付く」ような形で展開されるようになりました。これによってコマンドの
意味が変わることがあります(例:`&'が`&&'になる)。
cc. `make install'で、動的にロードできる組み込みコマンドのサンプルと
bashのヘッダーファイルのセットがインストールされるようになりました。
動的にロードできる組み込みコマンドを新しく開発するのに使います。
dd. `enable -f'により組み込みコマンドBUILTINをロードしたときに
BUILTIN_builtin_loadという名前の関数の呼び出しを試み、削除したとき
にBUILTIN_builtin_loadという名前の関数の呼び出しを試みるようになり
ました。これによって組み込みコマンドの初期化とクリーンアップのコー
ドを実行できます。
ee. 新しい変数BASH_LOADABLES_PATHは、`enable -f'が動的にロードする組み
込みコマンドの共有ライブラリを探すディレクトリのリストを設定します。
ff. `shopt'の`complete_fullquote'オプションは、ファイル名補完のときに
ファイル名やディレクトリ名に含まれるシェルのメタ文字をクォートする
ようにします。
gg. 組み込みコマンド`kill'には`-l'オプションと同じ意味の`-L'オプション
が追加されました。Linuxの外部コマンドのkillとの互換性のためです。
hh. BASH_COMPATとFUNCNESTはシェルの初期の環境変数から受け継がれて設定
されます。
ii. `shopt'の新しいオプションinherit_errexitをセットすると、コマンド置
換が-eオプションを受け継ぎます。デフォルトでサブシェルは-eを無効に
します。posixモードをオンにするとその一環として有効になります。
jj. 新しいプロンプト文字列PS0。対話的シェルで、すべてのコマンドを読み
取って実行する前に展開され表示されます。
kk. 対話的シェルでは起動時にSIGTSTP/SIGTTIN/SIGTTOUがSIG_DFLとして動作
します。子プロセスでもSIG_DFLが設定されます。
ll. posixモードのシェルは、履歴展開文字のクォートのダブルクォートを許
すようになりました。
mm. OLDPWDは、ディレクトリ名であれば環境変数から受け継がれます。
nn. rootで動くシェルはPS4を環境変数から受け継がないようになりました。
PS4の展開でのコマンド置換に関連するセキュリティホールをクローズし
ます。
oo. `autocd'オプションの設定により暗黙の`cd'が実行されるとき、`cd'とい
う名前の関数があれば、組み込みコマンド`cd'に優先して実行されます。
pp. 複合代入による配列の要素への代入で、値の変換(算術式展開、大文字小
文字の変換など)が起こるようになりました。
qq. `cd'の引数に複数のディレクトリを指定したときに致命的なエラーとする、
config-top.hで設定できるオプションが追加されました。
rr. bashは内部的にテンポラリファイルを作るときにmktemp()を使うようにな
りました。これにより多くのLinuxシステムでビルド時に警告が出ます。
2. Readlineの新機能
a. 履歴を切りつめるコードは履歴を書き込むコードと同じエラー回復メカニ
ズムを使うようになり、エラーが起きたときに古いバージョンの履歴ファ
イルを復帰させます。エラー回復メカニズムは、シンボリックリンクされ
た履歴ファイルを扱います。
b. 設定できる変数`enable-bracketed-paste'が加わりました。ターミナルの
bracketed pasteモードのサポートを有効にします。
c. 編集のモードを文字列で表示できるようになり、ユーザー設定が可能にな
りました(新しい変数`emacs-mode-string'、`vi-cmd-mode-string'、
`vi-ins-mode-string')。モード文字列には見えない文字のシーケンスを
含むこともできます。モード文字列に空文字列を設定するとデフォルトに
戻ります。
d. プロンプトの展開では、複数行のプロンプト(改行が含まれたもの)の最
終行にモード文字列を加えます。
e. 設定できる変数`colored-completion-prefix'が加わりました。セットす
ると、補完候補のリストで先頭の共通部分がカラーで表示されます。
f. 割り当てられるコマンド`vi-yank-pop'が加わりました。emacsモードでい
うyank-popのviモード版です。
g. 再描画のコードで、マルチバイトのロケールでの効率改善を行ないました。
h. insert-char関数は、ターミナルから入力されているる間、self-insertに
割り当てられた処理されていない先行入力の一括挿入を試みます。
i. rl_callback_sigcleanup:readlineのコールバックモードをクリーンアッ
プして状態を解除する新しいアプリケーション用の関数。シグナルの後に
使われる意図のもの。
j. インクリメンタル検索で末尾の文字をDELで削除するとき、検索文字列が
空になった場合に前の行にマッチすることはなくなりました。
k. readlineが履歴ファイルを読み込んだとき、`#'(または履歴のコメント
文字の値)で始まる履歴エントリは、履歴のタイムスタンプが有効であれ
ば、履歴エントリがタイムスタンプにより区切られたものとみなされます。
これにより複数行の履歴エントリが許されます。
l. readlineはキー割り当てが`:'か空白で終わっていないときにエラーを投
げるようになりました。
m. viモードでの^Wは、Posixで定められた単語境界に従うようになりました
(vi-unix-word-ruboutが、割り当てられるコマンド名です)。
n. rl_clear_visible_line:アプリケーションから呼べる新しい関数。現在
表示されているrealineの行が占めている行をクリアします。
o. rl_tty_set_echoing:readlineがターミナルにエコー出力するかどうかを
制御する、アプリケーションから呼べる新しい関数。
p. >|と、リダイレクト指定の前または後に数字の付いた文字列は、履歴展開
の字句解析で1つのトークンとして扱われます
q. 補完の表示で、指定された表示幅が表示する補完候補の長さより大きいと
きのバグを修正しました。
r. 履歴の:p修飾子は、行そのものに適用されるようになりました。:pを指定
した展開では、行は展開するのではなく表示されます。
s. アプリケーションから呼べる新しい関数rl_pending_signal()。readline
が受け取ってまだ処理していないシグナルのシグナル番号を返します。
t. アプリケーションから設定できる新しい変数
rl_persistent_signal_handlers。ゼロ以外の値が設定されると、
readlineはコールバックモードでreadline-6.2のシグナルハンドラの挙動
を有効にします。ハンドラはwhen rl_callback_handler_installが呼ばれ
たときにインストールされ、行が読み終わったときに削除されます。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment