Bashで報告される「間違った間接拡張」を制御するものは何ですか?

Bashで報告される「間違った間接拡張」を制御するものは何ですか?

私は間接拡張を使用してきましたが、変数が設定されていない場合、結果は空の文字列になります。

$ $SHELL --version | head -1
GNU bash, version 4.4.23(1)-release (x86_64-unknown-linux-gnu)
$ unset var
$ echo "${!var}"

$

ただし、新しいLinuxボックスでは失敗しますinvalid indirect expansion

$ $SHELL --version | head -1
GNU bash, version 5.0.7(1)-release (x86_64-pc-linux-gnu)
$ unset var
$ echo "${!var}"
-bash: var: invalid indirect expansion
$

明らかに、両方の場所で動作するようにコードを変更できますが、これまでは1つは失敗し、もう1つは失敗する2つのシステム間の正確な違いを理解することはできません。この違いが一番大きいのは何か知りたいです。この問題と今後発生する可能性のある同様の問題を解決することをお勧めします。

単にbashバージョンを変更した場合は、リリースノートまたはそれを示すコンテンツが見つかりません。そこにオプションが設定されていると見つかりません(ないかのようにset -u)。 FWIW以下は、shopt障害が発生したシステム(2番目の列)とエラーが発生していないシステム(3番目の列)の出力差です。

$ awk 'FNR==1{ARGIND++} {a[$1,ARGIND]=$2; b[$1]} END{for (var in b) if (a[var,1] != a[var,2]) print var, a[var,1], a[var,2]}' bad good | column -t
autocd              off
compat32            off
localvar_unset      off
lastpipe            off
localvar_inherit    off
complete_fullquote  on
assoc_expand_once   off
checkwinsize        on   off
globasciiranges     on
compat40            off
compat41            off
compat42            off
inherit_errexit     off
compat43            off
compat44            off
checkjobs           off
expand_aliases      on   off
globstar            off
progcomp_alias      off
dirspell            off
direxpand           off
login_shell         on   off

あるUnixシステムではエラーが発生し、別のシステムではエラーが発生しない理由を正確に知っている人はいますか?

ベストアンサー1

5.0 - アルファが変更されました。CHANGESBashソースのファイル次の項目があります。

This document details the changes between this version, bash-5.0-alpha, and
the previous version, bash-4.4-release.
[...]

y. If indirect expansion attempts to indirectly reference through an unset
   variable, report an error.

以下は、この問題のメーリングリストにある著者の投稿です。https://lists.gnu.org/archive/html/bug-bash/2016-11/msg00165.html

設定されていない変数またはnull値を持つ変数を介して参照を間接拡張しようとすると、エラーであることは明らかです。 Bash-4.3には最高のエラーチェック機能がなく、bash-4.4はnullケースをキャプチャします。また、設定されていない変数ケースをキャプチャするように修正します。

実際、Bash 4.4にはヌルエラーがあります。

$ ./bash4.4 -c 'var=; echo ${!var}'
./bash4.4: : bad substitution

おすすめ記事