Definire un alias e usarlo immediatamente


11

In zshquesto funziona benissimo:

alias foo=ls
foo

Ma questo non:

alias foo=ls; foo

Premere Invio per un tempo extra non è un problema durante l'esecuzione interattiva. Ma quando sshlo attraversi improvvisamente diventa un problema:

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

Anche con una nuova riga non funziona:

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

La cosa strana è che zshsa che è alias:

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

Come si dice zshche gli alias dovrebbero essere attivi?


È un problema comune con l'aliasing. L'ho provato usando bashe si cshsono comportati allo stesso modo. Spero che qualcuno possa spiegarlo.
Slyx,

Bash non è un problema: server ssh 'shopt -s expand_aliases; alias jj = ls \ njj'
Ole Tange,

Risposte:


9

Non puoi farlo.

Poiché gli alias sono stati espansi solo dopo l'espansione della cronologia e l'intera riga è stata letta in una sola volta, quindi quando è foostato eseguito, il processo di espansione dell'alias era sparito, è troppo tardi perché la shell riconosca il nuovo alias.

Il modo migliore che puoi fare è definire l'alias .zshrco usare la funzione come la risposta di jimmij o usare eval:

alias foo=ls; eval foo

C'è un caso speciale con zsh -c . In questo caso, quegli alias che sono stati definiti .zshenvverranno espansi.


Questo non spiegherebbe perché ssh host 'alias foo=bar<newline>foo'non funziona. C'è un caso speciale perzsh -c
Stéphane Chazelas,

Oppure usaalias foo=ls; eval foo
Stéphane Chazelas il

@ StéphaneChazelas: grazie per le informazioni, aggiornate con loro. Per sshquanto riguarda il caso, potresti per favore renderlo più chiaro. Penso che il comando sia stato ancora letto in una volta sola.
cuonglm,

10

Questo è un problema ben noto che è anche descritto nel zshmanuale al capitolo ALIASING (vedi man zshmisc). Il modo consigliato di gestirlo è utilizzare la funzione anziché l'alias:

foo() { ls; } ; foo

o meglio in caso di ls:

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

ps. punto e virgola alla fine della definizione della funzione (elenco) e spazi non sono necessari in zsh, ma come abitudine da altre shell li metto ancora.


1

Usando la c-shell (tcsh per essere esatti) dalla riga di comando:

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

o inseriscilo nel file .cshrc quindi procedi nel file:

mymachine % source ~/.cshrc

mymachine % showme
here it is

mymachine % ssh garnet showme
here it is
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.