O exemplo abaixo ilustra o tipo de "Daily WTF" que considero zsh
scripting como sendo. Eu praticamente desisti de entender as volumosas regras de zsh
o suficiente para ser capaz de descobrir casos tão desconcertantes por conta própria, mas eu ainda espero encontrar alguma configuração, técnica, ferramenta ou truque. Isso, pelo menos, me ajudará a dissecar o que está acontecendo. Algo análogo em espírito para passar por algum código com um depurador, ou ver um traço de sua execução.
Eu achei que ${(%):-%x}
era apenas uma espécie de abreviação de ${(%)NONEXISTENT:-%x}
, em que NONEXISTENT
representa qualquer identificador que não esteja definido no ambiente atual. E, de fato, parece que isso é verdade:
# /tmp/test
echo "${(%)NONEXISTENT:-%x}"
echo "${(%):-%x}"
Resultados:
% zsh /tmp/test
/tmp/test
/tmp/test
Portanto, imaginei, pelo mesmo raciocínio, que ${(%)-%x}
seria apenas uma pequena abreviação para ${(%)NONEXISTENT-%x}
.
Como você provavelmente espera agora, eu estava errado. Isso é mostrado pelo script abaixo, que apenas estende o script mostrado anteriormente com mais algumas linhas:
# /tmp/test
echo "${(%)NONEXISTENT:-%x}"
echo "${(%):-%x}"
echo "${(%)NONEXISTENT-%x}"
echo "${(%)-%x}"
Resultado:
% zsh /tmp/test
/tmp/test
/tmp/test
/tmp/test
569X
Para adicionar ao mistério, os detalhes dependem de o script ser executado ou originado:
% source /tmp/test
/tmp/test
/tmp/test
/tmp/test
5679BJTVXgim