O valor da minha variável é 0, mas eu não configurei para 0

7

Hoje eu notei que uma das minhas funções zsh não está funcionando; Eu investiguei a questão, e o culpado foi este:

for i in a b
do
echo "$i"
done
0
0

Então eu abri um novo zsh, e nisso as coisas estavam funcionando normalmente:

for i in a b
do
echo "$i"
done
a
b

Alguém pode explicar o motivo por trás do primeiro agindo de forma estranha para mim?

    
por HappyFace 18.08.2018 / 20:37

1 resposta

10
% typeset -i i
% for i in a b; print $i
0
0

Variáveis em zsh podem ser atribuídas a vários tipos, acima de -i para "representar internamente como um inteiro", o que fará com que a variável seja representada como tal. Isso também pode ser feito via integer i . Existem várias maneiras de inspecionar o que é uma variável:

% print ${(t)i}
integer
% typeset -p i
typeset -i i=0

E o shell usual + para desativar (veja também set -x , set +x ) it:

% typeset +i i
% for i in a b; print $i
a
b

Pode ser interessante descobrir o que mudou o tipo dessa variável e restringir essa alteração a um escopo local (dentro de uma função) para que o namespace global não seja poluído com tipos aleatórios, especialmente em nomes de variáveis descartáveis usados, como como i . É bastante fácil poluir o namespace global, pois tudo o que requer é atribuição a uma variável não declarada:

% () { local l=42; g=43 }
% print $l

% print $g
43

Ou alguém pode adicionar desnecessariamente o sinal -g a um typeset , o que torna a variável global:

% () { typeset -g -i h=42 }
% for h in a b; print $h
0
0

Variáveis exportadas podem persistir em novos processos (um filho não-subshell via fork , ou uma substituição via exec ), mas não o tipo:

% 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
    
por 18.08.2018 / 21:26

Tags