Bash: `-su: $*: 바인딩되지 않은 변수` 및 `set -u`

Bash: `-su: $*: 바인딩되지 않은 변수` 및 `set -u`

이것은 GNU bash 버전 4.0을 실행하는 FreeBSD 7.x 시스템입니다.

Bash에서 이 set -u옵션은 다음과 같이 설정되지 않은 변수를 발견할 때 쉘이 오류를 인쇄하도록 강제합니다.

$ set -u
$ echo $THISISUNSET
-su: THISISUNSET: unbound variable
$ echo $?
1

그러나 $*에서도 동일한 오류가 발생합니다.

$ echo $*
-su: $*: unbound variable
$ echo $?
1
$ echo $@
-su: $@: unbound variable

배쉬 매뉴얼4.3.1 내장 컬렉션특히 set -u$* 및 $@는 무시됩니다.

-u 매개변수 확장을 수행할 때 설정되지 않은 변수와 특수 매개변수 "@" 또는 "*" 이외의 매개변수를 오류로 처리합니다. 오류 메시지가 표준 오류에 기록되고 비대화형 쉘이 종료됩니다.

이 문제를 어떻게 해결할 수 있나요?

답변1

이는 이전 버전의 bash, 특히 4.0​β2 패치 수준 d에서 4.0 패치 수준 m까지의 버그입니다. ~에서변경 로그4.0에서 4.1​α로:

명사 set -u최신 Posix를 준수하도록 동작이 수정되었습니다. 설명: $@ 및 $* 이외의 설정되지 않은 변수를 확장할 때마다 쉘이 종료됩니다.

이 동작은 이전(그리고 현재의) 동작이 문제가 있는 것으로 간주되었기 때문에 4.0β2에서 도입되었습니다.

d. -u 옵션이 활성화되고 위치 인수가 없을 때 $@ 및 $* 확장이 셸을 종료하지 못하는 버그를 수정했습니다.

관련 정보