Use a palavra reservada shell se estiver oculta por um alias

2

Como posso acessar uma palavra reservada se um alias estiver ocultando-a?

Aqui if funciona normalmente:

% if : ; then echo true; fi
true

Após aliasing if :

% alias if=date
% if : ; then echo true; fi
zsh: parse error near 'then'

Prefixar com builtin ou \ não ajuda:

% builtin if : ; then echo true; fi
zsh: parse error near 'then'
% \if : ; then echo true; fi
zsh: parse error near 'then'

Como eu acesso uma palavra reservada no caso patológico que ela oculta por um alias?

    
por Tom Hale 15.07.2018 / 12:55

2 respostas

3

a resposta de schily me indicou Formação de linguagem de comandos do Shell POSIX 2.3.1 que diz:

However, reserved words in correct grammatical context shall not be candidates for alias substitution.

Confirmei que o comportamento padrão {ba,z}sh não segue o acima.

Eu perguntei sobre zsh-workers e fui direcionado para a opção POSIX_ALIASES , sobre o qual a página de manual diz:

  POSIX_ALIASES <K> <S>
          When this option is set, reserved words are not candidates for
          alias expansion:  it is still possible to declare any of them as
          an alias, but the alias will never be expanded.  Reserved words
          are described in the section RESERVED WORDS in zshmisc(1).
    
por 15.07.2018 / 14:28
0

Tente usar um shell que não tenha esse bug.

O padrão diz que uma palavra reservada não pode estar sujeita a expansão de alias.

Então:

alias if=echo
if : ; then echo true; fi

imprime true com conchas escritas corretamente.

Infelizmente, bash também não está correto, mas ksh93 , bosh e dash se comportam corretamente.

Para dar mais dicas:

  • uma barra invertida antes de um nome alternativo desabilitar esse alias em shells escritos corretamente.

  • uma barra invertida antes de uma palavra reservada, faz deste token uma palavra normal.

Como resultado, \if desativa o alias, mas ao mesmo tempo torna uma palavra não reservada.

    
por 15.07.2018 / 13:26

Tags