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
$

분명히 두 위치 모두에서 작동하도록 코드를 변경할 수 있지만 지금까지는 하나는 실패하고 다른 하나는 실패하게 만드는 두 시스템 간의 정확한 차이점을 파악할 수 없습니다. 이 차이점이 가장 큰 것이 무엇인지 알고 싶습니다. 이 문제 및 향후 발생할 수 있는 유사한 문제를 해결하는 것이 좋습니다.

단지 bash 버전 변경인 경우 릴리스 노트나 이를 나타내는 내용을 찾을 수 없습니다. 거기에 옵션이 설정되어 있으면 찾을 수 없습니다(없는 것처럼 set -u). FWIW 다음은 shopt실패한 시스템(두 번째 열)과 오류가 발생하지 않은 시스템(세 번째 열) 간의 출력 차이입니다.

$ 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에는 null 오류가 있습니다.

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

관련 정보