
Bash 4.2では、変数は関数に対してローカルに宣言されていますが、いいえそれでもデフォルトは変数リストに含まれます。少なくとも「declare -p」に関する限り:
vermicelli$ bash --version | grep release
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
vermicelli$ bash -c 'f1() { local Y; declare -p Y; }; f1'
declare -- Y
vermicelli$
しかし、bash 4.3ではもうそうではありません。
lasagne$ bash --version | grep release
GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)
lasagne$ bash -c 'f1() { local Y; declare -p Y; }; f1'
bash: line 0: declare: Y: not found
lasagne$
この動作の変更はどこにも文書化されていますか?
デフォルト値がある場合はい提供されている場合(たとえば、「local Y」を「local Y = 42」に変更)、両方のbashバージョンは同じように機能します。
(Bash 4.3のマニュアルページ、特に宣言とローカルの組み込み機能を扱う段落、shoptオプションcompat42とFAQ、特に4.3の新機能を扱う段落を確認しましたが、次の言及は見つかりませんでした。この動作は変わります)。
答え1
Bash変更ログからの抜粋:
この資料では、bash-4.4-alphaのバージョンと以前のバージョンであるbash-4.3-releaseの間の変更について詳しく説明します。
3. Bashの新機能
F.宣言オプションと同様の組み込み関数は、その
-p
変数にまだ値が割り当てられていなくても(技術的に設定されていない)名前付き変数のプロパティを表示します。
この資料では、bash-4.3-alphaのバージョンと以前のバージョンであるbash-4.2-releaseの間の変更について詳しく説明します。
1. Bashの変更点
へへ。属性が指定されているが値が割り当てられていない変数を生成し、検索するバグを修正し
declare
ました。test
対応する変数が設定されていません。
関数内で呼び出すとエラーが発生しない限り、これはlocal
単なるエイリアスです。declare
local
設定されていない変数のリストはバグと見なされtypeset -p
ましたが、declare -p
その変数をリストしたため、動作が復元されました。「十分に一般的なリクエスト」。