Por que os modificadores de pré-comando do zsh param de aceitar argumentos se forem citados?

4

zsh tem modificadores de pré-encomenda, que precedem um comando para alterar a forma como o comando é interpretado. Alguns deles são command e exec .

$ zsh -c 'exec -a foo zsh -c "print -- \
$ zsh -c '\exec -a foo zsh -c "print -- \
$ zsh -c 'exec -a foo zsh -c "print -- \
$ zsh -c '\exec -a foo zsh -c "print -- \%pre%"'
zsh:1: command not found: -a
$ zsh -c '\command -v ls'
zsh:1: command not found: -v
"' foo $ zsh -c 'command -v ls' /bin/ls
"' zsh:1: command not found: -a $ zsh -c '\command -v ls' zsh:1: command not found: -v
"' foo $ zsh -c 'command -v ls' /bin/ls

Mas eles pararam de aceitar argumentos se citados:

%pre%

Parece que eles foram executados imediatamente sem processar outros argumentos.

Isso impede que o alias chamado command ou exec da expansão seja impossível.

Isso é um bug ou um recurso? Está documentado em algum lugar?

    
por cuonglm 29.03.2017 / 15:44

1 resposta

3

O Zsh analisa os modificadores de pré-comando da mesma forma que os aliases e palavras-chave: eles precisam estar no início de um comando, sem aspas. Isso é praticamente necessário para modificadores que afetam a análise do comando ( noglob , nocorrect ). Os modificadores de pré-comando builtin , command , exec usam a mesma lógica internamente, embora possam ser interpretados de outra forma.

Tanto quanto eu posso dizer, não há nenhuma razão profunda para essa lógica, apenas que foi feito desta forma há algumas décadas e ninguém se importou o suficiente sobre este caso de ponta para consertá-lo.

Dado que algo como \command -v ls não faz nada sensato, é definitivamente um erro.

    
por 30.03.2017 / 01:56

Tags