Definir un alias e inmediatamente usarlo


11

En zshesto 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 sshrepente 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 zshsabe que tiene un alias:

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

¿Cómo saber zshque los alias deben estar activos?


Es un problema común con los alias. Lo intenté usando bashy cshy se comportaron de la misma manera. Espero que alguien pueda explicar eso.
Slyx

Bash no es un problema: servidor ssh 'shopt -s expand_aliases; alias jj = ls \ njj'
Ole Tange

Respuestas:


9

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 foose 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 .zshrco usar funciones como la respuesta de jimmij o usar eval:

alias foo=ls; eval foo

Hay un caso especial con zsh -c . En este caso, los alias que se definieron en .zshenvse expandirán.


Eso no explicaría por qué ssh host 'alias foo=bar<newline>foo'no funciona. Hay un caso especial parazsh -c
Stéphane Chazelas

O usealias foo=ls; eval foo
Stéphane Chazelas

@ StéphaneChazelas: Gracias por la información actualizada con ellos. Sobre el sshcaso, ¿podría aclararlo más? Creo que el comando todavía se leía de una vez.
Cuonglm

10

Este es un problema muy conocido que incluso se describe en el zshmanual en el capítulo ALIAR (ver man zshmisc). La forma recomendada de tratarlo es usar la función en lugar del alias:

foo() { ls; } ; foo

o mejor aún en el caso de ls:

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

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.


1

Usando el c-shell (tcsh para ser exactos) de la línea de comando:

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

o póngalo en el archivo .cshrc y luego obtenga el archivo:

mymachine % source ~/.cshrc

mymachine % showme
here it is

mymachine % ssh garnet showme
here it is
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.