Definir um alias e usá-lo imediatamente

11

Em zshIsso funciona bem:

alias foo=ls
foo

Mas isso não:

alias foo=ls; foo

Pressionar inserir um tempo extra não é um problema ao executar interativamente. Mas, ao executá- sshlo, de repente se torna um problema:

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

Mesmo com uma nova linha, ela não funciona:

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

O estranho é que zshsabe que é um alias:

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

Como saber se zshos aliases devem estar ativos?

Ole Tange
fonte
É um problema comum com alias. Eu tentei usar bashe cshe eles se comportaram da mesma maneira. Espero que alguém possa explicar isso.
Slyx
Bash não é um problema: servidor ssh 'shopt -s expand_aliases; apelido jj = ls \ njj'
Ole Tange

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, portanto, quando foofoi executado, o processo de expansão do alias desapareceu, é muito tarde para o shell reconhecer um novo alias.

A melhor maneira de fazer isso é definir alias .zshrcou usar funções como a resposta de jimmij ou usar eval:

alias foo=ls; eval foo

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

cuonglm
fonte
Isso não explica por ssh host 'alias foo=bar<newline>foo'que não funciona. Há um caso especial parazsh -c
Stéphane Chazelas 16/08/2015
Ou use #alias foo=ls; eval foo
Stéphane Chazelas
@ StéphaneChazelas: Obrigado pela informação, atualizada com eles. Sobre o sshcaso, você poderia deixar mais claro. Eu acho que o comando ainda foi lido de uma só vez.
cuonglm
10

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

foo() { ls; } ; foo

ou ainda melhor em caso de ls:

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

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

jimmij
fonte
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 origine o arquivo:

mymachine % source ~/.cshrc

mymachine % showme
here it is

mymachine % ssh garnet showme
here it is
user3227618
fonte