Podobnie jak większość użytkowników, mam skonfigurowanych kilka aliasów, które dają domyślny zestaw flag dla często używanych programów. Na przykład,
alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'
Problem polega na tym, że jeśli chcę użyć, which
aby zobaczyć, skąd pochodzi mój vim
/ grep
/ ls
/ etc, alias przeszkadza:
$ which vim
vim: aliased to vim -X
Jest to użyteczne wyjście, ale nie to, czego szukam w tym przypadku; Wiem, że vim
jest aliasem vim -X
, ale chcę wiedzieć, gdzie to vim
pochodzi.
Czy which
brakuje mi tymczasowego usunięcia definicji aliasu, abym mógł z niego korzystać, czy jest prosty sposób na which
„rozpakowanie” aliasu i uruchomienie się na nim?
Edycja: Wygląda na which
to, że jest to wbudowana powłoka o różnych zachowaniach w różnych powłokach. W Bash działa sugestia SiegeX dotycząca --skip-alias
flagi; jednak jestem na Zsh. Czy istnieje coś podobnego?
vim
pochodzi , skorzystajwhere vim
Odpowiedzi:
which
jest w rzeczywistości złym sposobem na robienie takich rzeczy, ponieważ zgaduje o twoim środowisku na podstawie$SHELL
plików startowych (tak myśli), których używa powłoka; czasami nie tylko zgaduje, że jest źle, ale ogólnie nie można powiedzieć, aby zachowywał się inaczej. (which
na moim Ubuntu 10.10 nie rozumie,--skip-alias
jak wspomniano na przykład @SiegeX).type
wykorzystuje bieżące środowisko powłoki zamiast szturchać plików konfiguracyjnych i może zostać poproszony o zignorowanie części tego środowiska, więc pokazuje ci, co faktycznie wydarzy się zamiast tego, co by się stało w rekonstrukcji domyślnej powłoki.W takim przypadku
type -P
pominie wszelkie aliasy lub funkcje:Możesz również poprosić go o zerwanie wszystkich warstw, pojedynczo i pokazanie, co by znalazł:
(Rozszerzając to na podstawie komentarzy :)
Problem
which
polega na tym, że zwykle jest to program zewnętrzny zamiast wbudowanej powłoki, co oznacza, że nie widzi twoich aliasów lub funkcji i musi spróbować je zrekonstruować z plików startowych / konfiguracyjnych powłoki. (Jeśli jest to wbudowana powłoka, tak jak jest,zsh
ale najwyraźniej niebash
jest, bardziej prawdopodobne jest, że użyje środowiska powłoki i zrobi właściwą rzecz.)type
jest poleceniem zgodnym z POSIX, które musi zachowywać się tak, jakby było wbudowane (tzn. musi używać środowiska powłoki, do której jest wywoływane, w tym lokalnych aliasów i funkcji), więc zwykle jest to wbudowane.Zazwyczaj nie można go znaleźć w
csh
/tcsh
, chociaż w większości współczesnych wersjiwhich
jest on wbudowany w powłokę i działa poprawnie; czasami wbudowane jestwhat
zamiast tego, a czasem nie ma dobrego sposobu, aby zobaczyć środowisko bieżącego shella zcsh
/tcsh
w ogóle.źródło
type -a
wydaje się , że zwracają wszystkie twoje wystąpienia$PATH
, nie tylko pierwsze. Chyba będę aliaswhich
dotype
:)type
jest częścią standardu POSIX, to jest to właściwy sposób. Aby odpowiedzieć na moje pytanie, wpisz również działa na zsh (na Debianie). Dlaczego dystrybucje się nie pozbywają,what
awhich
jeśli nie są znormalizowane i nie mają dodatkowej funkcjonalności?info bash 'Bash builtins'
od Linuksa, chociaż można go również pobrać zzsh
podręcznika. Bardziej oficjalnie, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (co zwrócić uwagę w rzeczywistości nie wg planu-P
lub-a
, lub nawet-p
co było oryginalną formą-P
, ale wymaga to, że korzystać z bieżącym środowisku powłoki).type -p
zachowuje się inaczej między zsh a bash.type -P
w ogóle nie istnieje w Zsh.W
bash
:W
zsh
:Zarówno:
Lub:
źródło
W Zsh
which
jest wbudowane, ponieważ to polecenie informuje:Aby wykonać polecenie zewnętrzne (w dowolnej powłoce)
which
, użyj pełnej ścieżki :w ten sposób polecenie
ls
zostało znalezione (wartość wyjściowa 0) i znajduje się na/bin/ls
.Wewnątrz
zsh
; sposobem (oprócz powyższego) wyszukiwania zewnętrznych poleceń jest:Jednak to nie rozwiąże zagnieżdżonych aliasów, takich jak:
Polecenie zgłosi, że nie
dire
znaleziono polecenia.Aby rozwiązać problem zagnieżdżonych aliasów (ręcznie), patrz
Resolve nested aliases to their source commands
źródło
Mój zdefiniowany jako taki
źródło
Spróbuj wykonać następujące czynności:
źródło
which
tak naprawdę jest to wbudowana powłoka, a nie zwykłe narzędzie uniksowe, jak zakładałem. Więc powinienem edytować moje pytanie i podać Zsh. Dzięki za zwrócenie mi na to uwagi!which
nie jest wbudowany, przynajmniej nie na Debianie. Jest to skrypt powłoki i część debianutils, więc działa na zsh. Jednak--skip-alias
nie jest opcjąwhich
na Debianie. Czy istnieją różne odmianywhich
latania? To nie wydaje się być znormalizowanym poleceniem.man zshbuiltins
. która nazwa [-wpams] ... Odpowiednik wherece -c.bash
, nie jest to wbudowane i nie ma--skip-alias
opcji./usr/bin/which
plus alias,/etc/profile.d
który pozwala na obsługę aliasów, ale--skip-alias
działa. W rezultaciewhich which
pokazuje alias, alecommand which which
pokazuje plik wykonywalny!Innym jest alternatywą
command which vim
, która działa w ten sam sposób w obuzsh
ibash
Np. Na moim komputerze Mac:
źródło
Oba
type
iwhich
zachowują się inaczej w zależności od typu powłoki.W bash
which
to polecenie istnieje wPATH
. Przeszukuje podane poleceniePATH
. Wbudowane Bashtype -P
(P forPATH
) zachowuje się dokładnie tak samowhich
.W ZSH zarówno
which
itype
są wbudowane, jak i częściowe funkcje wbudowanewhence
.which -p
jest tym, czego chcesz. Wymusza wyszukiwanie ścieżki. (-P
opcja nie jest dostępna dlatype
ZSH.)Więcej z instrukcji ZSH.
Aby pominąć
builtin
which
i wymusić użycie poleceniawhich
zPATH
ZSH:źródło