Bash 4.2에서는 변수가 함수에 대해 로컬로 선언되지만아니요그래도 기본값은 변수 목록에 포함됩니다. 적어도 "declare -p"에 관한 한:
vermicelli$ bash --version | grep release
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
vermicelli$ bash -c 'f1() { local Y; declare -p Y; }; f1'
declare -- Y
vermicelli$
그러나 bash 4.3에서는 더 이상 그렇지 않습니다.
lasagne$ bash --version | grep release
GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)
lasagne$ bash -c 'f1() { local Y; declare -p Y; }; f1'
bash: line 0: declare: Y: not found
lasagne$
이 동작 변경 사항이 어디에도 문서화되어 있나요?
기본값이 있는 경우예제공된 경우(예: "local Y"를 "local Y=42"로 변경) 두 bash 버전 모두 동일하게 작동합니다.
(Bash 4.3의 매뉴얼 페이지, 특히 선언 및 로컬 내장 기능을 다루는 단락, shopt 옵션 compat42 및 FAQ, 특히 4.3의 새로운 기능을 다루는 단락을 확인했지만 다음에 대한 언급은 찾지 못했습니다. 이 동작은 변경됩니다).
답변1
Bash 변경 로그에서 발췌:
이 문서에서는 bash-4.4-alpha 버전과 이전 버전인 bash-4.3-release 간의 변경 사항을 자세히 설명합니다.
3. Bash의 새로운 기능
에프. 선언 옵션 및 유사한 내장 함수는
-p
해당 변수에 아직 값이 할당되지 않은 경우에도(기술적으로 설정되지 않은) 명명된 변수의 속성을 표시합니다.
이 문서에서는 bash-4.3-alpha 버전과 이전 버전인 bash-4.2-release 간의 변경 사항을 자세히 설명합니다.
1. Bash의 변경 사항
헤헤. 속성이 지정되었지만 값이 할당되지 않은 변수를 발생시키고 찾는
declare
버그 를 수정했습니다 .test
해당 변수가 설정되어 있지 않습니다.
함수 내에서 호출하면 오류가 발생 하지 않는 한 이것은 local
단지 별칭일 뿐입니다 .declare
local
설정되지 않은 변수를 나열하는 것은 typeset -p
버그로 간주되었지만 declare -p
해당 변수를 나열했기 때문에 동작이 복원되었습니다."충분히 일반적인 요청".