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.