저는 간접 확장을 사용해 왔으며 변수가 설정되지 않은 경우 결과는 빈 문자열이 됩니다.
$ $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-알파가 변경되었습니다.CHANGES
Bash 소스의 파일다음 항목이 있습니다.
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