En zsh
esto funciona bien:
alias foo=ls
foo
Pero esto no:
alias foo=ls; foo
Al presionar enter un tiempo extra no es un problema cuando se ejecuta de forma interactiva. Pero cuando atravesarlo de ssh
repente se convierte en un problema:
% ssh zsh@server 'alias foo=ls; foo'
zsh:1: command not found: foo
Incluso con una nueva línea no funciona:
% ssh zsh@server 'alias foo=ls;
foo'
zsh:2: command not found: foo
Lo extraño es que zsh
sabe que tiene un alias:
% ssh zsh@server 'alias foo=ls; alias'
foo=ls
run-help=man
which-command=whence
¿Cómo saber zsh
que los alias deben estar activos?
bash
ycsh
y se comportaron de la misma manera. Espero que alguien pueda explicar eso.Respuestas:
No puedes hacerlo.
Debido a que los alias se expandieron solo después de la expansión del historial y se leyó toda la línea de una vez, por lo que cuando
foo
se ejecutó, el proceso de expansión de alias desapareció, es demasiado tarde para que el shell reconozca un nuevo alias.La mejor manera de hacerlo es definir un alias
.zshrc
o usar funciones como la respuesta de jimmij o usareval
:Hay un caso especial con zsh -c . En este caso, los alias que se definieron en
.zshenv
se expandirán.fuente
ssh host 'alias foo=bar<newline>foo'
no funciona. Hay un caso especial parazsh -c
alias foo=ls; eval foo
ssh
caso, ¿podría aclararlo más? Creo que el comando todavía se leía de una vez.Este es un problema muy conocido que incluso se describe en el
zsh
manual en el capítulo ALIAR (verman zshmisc
). La forma recomendada de tratarlo es usar la función en lugar del alias:o mejor aún en el caso de
ls
:PD. el punto y coma al final de la definición de función (lista) y los espacios no son necesarios en zsh, pero como un hábito de otros shells todavía los pongo.
fuente
Usando el c-shell (tcsh para ser exactos) de la línea de comando:
o póngalo en el archivo .cshrc y luego obtenga el archivo:
fuente