오늘 나는 내 zsh 기능 중 하나가 작동하지 않는 것을 발견했습니다. 문제를 조사한 결과 범인은 다음과 같습니다.
for i in a b
do
echo "$i"
done
0
0
그런 다음 새 zsh를 열면 모든 것이 잘 작동합니다.
for i in a b
do
echo "$i"
done
a
b
첫 번째 사람이 나에게 이상하게 행동하는 이유를 설명할 수 있는 사람이 있나요?
답변1
% typeset -i i
% for i in a b; print $i
0
0
의 변수에는 zsh
위의 -i
"내부적으로 정수로 표시되는" 다양한 유형이 할당될 수 있으며, 이로 인해 변수가 정수로 표시됩니다. 이는 를 통해서도 수행할 수 있습니다 integer i
. 변수가 무엇인지 확인하는 방법에는 여러 가지가 있습니다.
% print ${(t)i}
integer
% typeset -p i
typeset -i i=0
+
그리고 이를 비활성화하는 공통 쉘(도 참조 set -x
) set +x
:
% typeset +i i
% for i in a b; print $i
a
b
특히 자주 사용되는 일회용 변수 이름에서 전역 네임스페이스가 무작위 유형으로 오염되지 않도록 해당 변수의 유형을 변경하는 내용을 찾아 함수 내에서 로컬 범위로 제한하는 것이 도움이 될 수 있습니다. i
선언되지 않은 변수에 할당하면 되기 때문에 전역 네임스페이스를 오염시키는 것은 매우 쉽습니다.
% () { local l=42; g=43 }
% print $l
% print $g
43
또는 누군가 변수를 전역 변수 -g
로 만들기 위해 불필요하게 플래그를 추가 할 수도 있습니다 typeset
.
% () { typeset -g -i h=42 }
% for h in a b; print $h
0
0
내보낸 변수는 새 프로세스( 를 통한 비-하위 쉘 하위 프로세스 fork
또는 를 통한 대체 exec
)에 지속될 수 있지만 유형은 다음을 수행하지 않습니다.
% export -i h=42
% print $h ${(t)h}
42 integer-export
% ( print ${(t)h} )
integer-export
% exec zsh -l
% print $h ${(t)h}
42 scalar-export