Zdefiniowanie aliasu i natychmiast go użyj

11

W zshtym działa dobrze:

alias foo=ls
foo

Ale to nie:

alias foo=ls; foo

Naciśnięcie klawisza „wprowadź dodatkowy czas” nie stanowi problemu podczas działania interaktywnego. Ale podczas sshjego przeglądania nagle staje się problemem:

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

Nawet w przypadku nowej linii nie działa:

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

Dziwne jest to, że zshwie, że jest to alias:

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

Jak powiedzieć, zshże aliasy powinny być aktywne?

Ole Tange
źródło
Jest to powszechny problem z aliasingiem. Próbowałem go używając bashi csha oni zachowywali się tak samo. Mam nadzieję, że ktoś to wyjaśni.
Slyx,
Bash nie stanowi problemu: serwer ssh 'shopt -s expand_aliases; alias jj = ls \ njj'
Ole Tange

Odpowiedzi:

9

Nie możesz tego zrobić.

Ponieważ aliasy zostały rozwinięte dopiero po rozwinięciu historii, a cały wiersz został odczytany za jednym razem, więc kiedy foozostało wykonane, proces rozszerzania aliasu zniknął, jest za późno, aby powłoka rozpoznała nowy alias.

Najlepszym sposobem jest zdefiniowanie aliasu w .zshrcfunkcji lub użycie funkcji takiej jak odpowiedź jimmij lub użycie eval:

alias foo=ls; eval foo

Istnieje specjalny przypadek z zsh -c . W tym przypadku zdefiniowane aliasy .zshenvzostaną rozszerzone.

Cuonglm
źródło
To nie wyjaśniałoby, dlaczego ssh host 'alias foo=bar<newline>foo'nie działa. Jest szczególny przypadekzsh -c
Stéphane Chazelas
Lub użyjalias foo=ls; eval foo
Stéphane Chazelas
@ StéphaneChazelas: Dzięki za informacje, zaktualizowane o nie. Jeśli chodzi o sshprzypadek, czy możesz to wyjaśnić. Myślę, że polecenie zostało odczytane za jednym razem.
cuonglm,
10

Jest to bardzo dobrze znany problem, który jest nawet opisany w zshpodręczniku w rozdziale ALIASING (patrz man zshmisc). Zalecanym sposobem radzenia sobie z tym jest użycie funkcji zamiast aliasu:

foo() { ls; } ; foo

lub nawet lepiej w przypadku ls:

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

ps. średnik na końcu definicji funkcji (lista) i spacje nie są potrzebne w zsh, ale jako nawyk z innych powłok wciąż je umieszczam.

jimmij
źródło
1

Używając powłoki c (dokładnie tcsh) z wiersza poleceń:

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

lub umieść go w pliku .cshrc, a następnie źródłowy plik:

mymachine % source ~/.cshrc

mymachine % showme
here it is

mymachine % ssh garnet showme
here it is
użytkownik3227618
źródło