Definindo um alias e imediatamente usá-lo

10

Em zsh , isso funciona bem:

alias foo=ls
foo

Mas isso não acontece:

alias foo=ls; foo

Pressionar enter extra time não é um problema ao executar interativamente. Mas quando percorremos ssh , de repente se torna um problema:

% ssh zsh@server 'alias foo=ls; foo'
zsh:1: command not found: foo

Mesmo com uma nova linha, não funciona:

% ssh zsh@server 'alias foo=ls;
foo'
zsh:2: command not found: foo

O mais estranho é que zsh sabe que é um alias:

% ssh zsh@server 'alias foo=ls; alias'
foo=ls
run-help=man
which-command=whence

Como informar a zsh que os aliases devem estar ativos?

    
por Ole Tange 16.08.2015 / 19:00

3 respostas

9

Você não pode fazer isso.

Como os aliases foram expandidos somente após a expansão do histórico e a linha inteira foi lida de uma só vez, quando foo foi executado, o processo de expansão do alias desapareceu, é muito tarde para o shell reconhecer um novo alias.

A melhor maneira de definir o alias em .zshrc ou usar a função resposta do jimmij ou usar eval :

alias foo=ls; eval foo

Há um caso especial com zsh -c . Nesse caso, esses aliases que foram definidos em .zshenv serão expandidos.

    
por 16.08.2015 / 19:19
10

Este é um problema muito conhecido que é descrito em zsh manual no capítulo ALIASING (veja man zshmisc ). A maneira recomendada de lidar com isso é usar a função em vez do alias:

foo() { ls; } ; foo

ou melhor ainda no caso de ls :

foo() { ls -- "${@:-.}"; } ; foo

ps. ponto-e-vírgula no final da definição de função (lista) e espaços não são necessários em zsh, mas como um hábito de outros shells eu ainda os coloco.

    
por 16.08.2015 / 19:19
1

Usando o c-shell (tcsh para ser exato) na linha de comando:

mymachine % alias showme "echo here it is"
mymachine % showme
here it is

ou coloque-o no arquivo .cshrc e, em seguida, digite o arquivo:

mymachine % source ~/.cshrc

mymachine % showme
here it is

mymachine % ssh garnet showme
here it is
    
por 21.08.2015 / 14:09

Tags