Em zsh
Isso 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á- ssh
lo, 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 zsh
sabe que é um alias:
% ssh zsh@server 'alias foo=ls; alias'
foo=ls
run-help=man
which-command=whence
Como saber se zsh
os aliases devem estar ativos?
bash
ecsh
e eles se comportaram da mesma maneira. Espero que alguém possa explicar isso.Respostas:
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
foo
foi 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
.zshrc
ou usar funções como a resposta de jimmij ou usareval
:Há um caso especial com zsh -c . Nesse caso, os aliases que foram definidos em
.zshenv
serão expandidos.fonte
ssh host 'alias foo=bar<newline>foo'
que não funciona. Há um caso especial parazsh -c
alias foo=ls; eval foo
ssh
caso, você poderia deixar mais claro. Eu acho que o comando ainda foi lido de uma só vez.Esse é um problema muito conhecido, que é descrito no
zsh
manual, no capítulo ALIASING (consulteman zshmisc
). A maneira recomendada de lidar com isso é usar a função em vez do alias:ou ainda melhor em caso de
ls
: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.
fonte
Usando o c-shell (tcsh para ser exato) na linha de comando:
ou coloque-o no arquivo .cshrc e origine o arquivo:
fonte