
bash 4.4.20(1)を使用して実行すると、次のスクリプトが失敗します。
#!/bin/bash
bar() {
local args=("y")
}
foo() {
local -r args=("x")
bar
}
foo
エラーがありますが、line 3: args: readonly variable
読み取り後にbash 4.2.46(2)を使用して正常に実行することが意味があります。24.2。ローカル変数。
配列以外の変数を使用する次のスクリプトは問題なく実行されます。
#!/bin/bash
bar() {
local args="y"
}
foo() {
local -r args="x"
bar
}
foo
何も見つかりません。多様性これはbash 4.2.46(2)とbash 4.4.20(1)の違いを説明します。
Q:これはbash 4.4.20(1)のバグですか?これが期待される動作である場合、なぜ2番目のスクリプトが失敗しないのですか?
答え1
スクリプトはbash
5.1 バージョンのシェルでは正しく実行されますが、4.3 以降の中間バージョンでは実行されません。
これらのバグはおそらくバージョン4.3または4.4の頃に導入されたでしょう。両方のバージョンの開発中に、読み取り専用宣言と変数の動作方法にいくつかの変更が行われました。
変更ログには、問題のバグ修正に関連する可能性がある項目が複数あります。
- の場合、
bash-5.0-alpha
変更ログ言うことがあります。(readonly
組み込み関数を参照することもlocal -r
影響を受けると仮定します):
readonly
関数内の配列とスカラー変数に適用されると、組み込み関数が異なる動作をするバグを修正しました。
- の場合
bash-5.1-alpha
、これに関連する可能性がある別のエラーまた言及:
関数の一時環境に表示される変数と同じ名前のローカル変数がローカルに表示されないバグを修正しました。
均等に使用シェル用のGitリポジトリそして、あなたのスクリプトで発生したエラーを見つけました。bash-4.4-rc1
、その後固定bash-5.1-alpha
。どちらも大規模なコミットなので、コードの特定の変更を指摘することは困難です。