W zsh
tym 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 ssh
jego 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 zsh
wie, ż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?
bash
icsh
a oni zachowywali się tak samo. Mam nadzieję, że ktoś to wyjaśni.Odpowiedzi:
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
foo
zostało wykonane, proces rozszerzania aliasu zniknął, jest za późno, aby powłoka rozpoznała nowy alias.Najlepszym sposobem jest zdefiniowanie aliasu w
.zshrc
funkcji lub użycie funkcji takiej jak odpowiedź jimmij lub użycieeval
:Istnieje specjalny przypadek z zsh -c . W tym przypadku zdefiniowane aliasy
.zshenv
zostaną rozszerzone.źródło
ssh host 'alias foo=bar<newline>foo'
nie działa. Jest szczególny przypadekzsh -c
alias foo=ls; eval foo
ssh
przypadek, czy możesz to wyjaśnić. Myślę, że polecenie zostało odczytane za jednym razem.Jest to bardzo dobrze znany problem, który jest nawet opisany w
zsh
podręczniku w rozdziale ALIASING (patrzman zshmisc
). Zalecanym sposobem radzenia sobie z tym jest użycie funkcji zamiast aliasu:lub nawet lepiej w przypadku
ls
: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.
źródło
Używając powłoki c (dokładnie tcsh) z wiersza poleceń:
lub umieść go w pliku .cshrc, a następnie źródłowy plik:
źródło