Como rastrear a análise e expansão de parâmetros?

3

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
    
por kjo 17.10.2015 / 18:08

1 resposta

3

A documentação de

zsh tem uma seção de Regras descrevendo como a expansão de parâmetro foi aplicada. Você pode ficar com ele para saber o que o shell fará (AFAIK, não há depurador para isso).

O que você achou que estava certo, mas não em ${(%)-%x} form, porque $- é um dos variáveis especiais do shell , ele expandiu para as opções do shell.

Portanto, em ${(%)-%x} , o shell foi aplicado em flag % ao resultado de $- com o caractere literal x no final removido.

    
por 17.10.2015 / 19:26

Tags