다음 unset
부분을 이해하려고 노력 중입니다.https://unix.stackexchange.com/a/381782/674
unset
존재하다bash
현재 범위에서 선언된 설정되지 않은 변수만(전역 범위를 제외하고 선언을 유지합니다.; 속성과 값을 제거하고 변수는 더 이상 배열이나 해시가 아닙니다. 또한 namerefs에서는 참조된 변수를 설정 해제합니다.그렇지 않으면 위에서 언급한 스택에서 변수 레이어를 팝합니다.
Bash 매뉴얼에는 관련 내용이 언급되어 있지 않거나 놓쳤습니다.
예를 들어 설명해 주실 수 있나요?
- "현재 범위에 선언된 설정되지 않은 변수만"
"이것은 전역 예외에도 불구하고 명시됩니다."
unset
변수가 함수의 로컬 범위에 있으면 변수가 설정 해제될 뿐만 아니라 선언도 해제되지 않습니까unset
?unset
변수가 전역 범위에 있는 경우unset
변수가 설정 해제되었지만 여전히 선언되어 있습니까?변수가 선언되었는지 확인하는 방법은 무엇입니까?
"그렇지 않으면 위에서 언급한 스택에서 변수 레이어가 튀어나옵니다."
"그렇지 않으면"과 "가변 레이어"는 무엇을 의미합니까?
감사해요.
답변1
예를 들어 설명하는 것이 가장 좋습니다.
$ bash -c 'a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"'
declare -- a
0
이는 unset
동일한 범위에 선언된 변수에 대해 호출됩니다. 올바르게 설정이 해제되었습니다. 속성과 값은 손실되었지만 여전히 선언되어 있지만 여전히 해당 범위로 제한됩니다. 보시다시피, 을 실행했지만 a=2
여전히 a
로컬에서 수행되었으며 f
외부 범위의 항목은 영향을 받지 않았습니다. 이것은 좋고 우리가 원하는 것입니다.
존재하다:
$ ./bash -c 'a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"'
0
2
unset a
설정이 취소되지 않은 것을 확인할 수 있습니다 a
. 오히려 그것은 아래의 것, 즉 외부 구체로부터의 것을 드러낸다. g
반환 되면 f
변수는 a
더 이상 로컬이 아닙니다.
Bash 5+에서는 options 을 설정하여 이 문제를 해결할 수 있습니다 localvar_unset
.
어디가 더 나빠지는지 보셨나요 mksh
?yash
unset
터지다바꾸다설정되지 않음이는 동일한 범위에 선언된 변수의 경우에도 마찬가지입니다. 첫 번째 예는 다음과 같습니다.
typeset a=0
2
추가 자료: