Shell - Jak znaleźć katalog jakiejś komendy?

127

Wiem, że kiedy jesteś w powłoce, jedynymi poleceniami, których możesz użyć, są te, które można znaleźć w jakimś katalogu ustawionym na PATH. Nawet ja nie wiem, jak sprawdzić, jakie katalogi znajdują się w mojej zmiennej PATH (i to jest kolejne dobre pytanie, na które można odpowiedzieć), chciałbym wiedzieć:

Przychodzę do łuski i piszę:

$ lshw

Chcę poznać polecenie w powłoce, które może mi powiedzieć, GDZIE znajduje się to polecenie. Innymi słowy, gdzie znajduje się ten „plik wykonywalny”?

Coś jak:

$ location lshw
/usr/bin

Ktoś?

Gabriel L. Oliveira
źródło

Odpowiedzi:

187

Jeśli używasz Bash lub zsh, użyj tego:

type -a lshw

To pokaże, czy cel jest elementem wbudowanym, funkcją, aliasem czy zewnętrznym plikiem wykonywalnym. Jeśli to drugie, pokaże każde miejsce, w którym się pojawi PATH.

bash$ type -a lshw
lshw is /usr/bin/lshw
bash$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
bash$ zsh
zsh% type -a which
which is a shell builtin
which is /usr/bin/which

W Bash dla funkcji type -awyświetli również definicję funkcji. Możesz użyć declare -f functionnamedo zrobienia tego samego (musisz tego użyć dla zsh, ponieważ type -anie).

Wstrzymano do odwołania.
źródło
Dziękuję wszystkim, którzy odpowiedzieli, ale ta odpowiedź była najbardziej ekscytująca! Dziękuję Ci! Myślałem, że zwariowałem, ponieważ zdefiniowałem (dawno temu) sposób na zrobienie tego: „update”, a to robiło „apt-get update”; apt-get dist-upgrade 'dla mnie. Ale na razie próbowałem znaleźć gdzieś plik update.sh i nie mogłem go znaleźć. Dlatego zacząłem to pytanie. Ale teraz, używając 'type -a update' stwierdziłem, że był to tylko alias zdefiniowany w moim .bashrc znajdującym się w moim ~ home. Naprawdę dziękuję.
Gabriel L. Oliveira
1
@Gabriel: Jeśli go nie znasz locate, możesz znaleźć pliki. Korzysta z bazy danych, która jest obsługiwana przez updatedbzadanie cron. Ponieważ locateprzeszukuje bazę danych, a nie cały system plików, jest to znacznie szybsze niż find(co może być użyte w ostateczności).
Wstrzymano do odwołania.
Dziękuję Ci. Przestudiuję to narzędzie i zobaczę, jak planuje się uruchomić updateb na cronjob Ubuntu.
Gabriel L. Oliveira
Czasami type -amoże to być mylące. np. w przypadku nvmktórej jest funkcja bash, którą musiałem zrobić: type -a nvm | head -n1dowiedzieć się, co to dokładnie jest nvm.
Marinos An
@MarinosAn: W przypadku funkcji type -awyprowadza definicję funkcji oraz typ pliku wykonywalnego. Ryzyko związane z użyciem headpolega na tym, że w przypadku nazw z więcej niż jednym typem dodatkowe typy nie zostaną wyprowadzone. Możesz chcieć spojrzeć type -t.
Wstrzymano do odwołania.
64

Lubię to:

which lshw

Aby zobaczyć wszystkie polecenia pasujące do ścieżki:

which -a lshw 
Ignacio Vazquez-Abrams
źródło
7
również które -a lshw, aby zobaczyć wszystkie polecenia pasujące do twojej ścieżki.
AlG
Uważam, że działa to tylko z poleceniami (plikami wykonywalnymi w $ PATH), a nie z funkcjami.
Olivier Lacan,
whichjest problematyczne, ponieważ istnieje wiele implementacji, z których wiele działa całkowicie nieprawidłowo, a inne wydają się działać dobrze, ale mają dziwne niespodzianki. Zamiast tego wolisz type.
tripleee
Nie działa dla aliasów i funkcji bash. Przynajmniej na ubuntu. Lepsze wykorzystanietype -a lshw
Marinos An
17

PATH jest zmienną środowiskową i można ją wyświetlić za pomocą polecenia echo:

echo $PATH

To lista ścieżek oddzielonych dwukropkiem ' :'

whichPolecenia powie Ci, który plik zostanie wykonany po uruchomieniu polecenia:

which lshw

czasami otrzymujesz ścieżkę do dowiązania symbolicznego; jeśli chcesz prześledzić ten link do miejsca, w którym znajduje się rzeczywisty plik wykonywalny, możesz użyć readlinki przesłać mu dane wyjściowe which:

readlink -f $(which lshw)

-fParametr nakazuje readlinkzachować następujące dowiązania rekurencyjnie.

Oto przykład z mojego komputera:

$ which firefox
/usr/bin/firefox

$ readlink -f $(which firefox)
/usr/lib/firefox-3.6.3/firefox.sh
hasen
źródło
5
~$ echo $PATH
/home/jack/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
~$ whereis lshw
lshw: /usr/bin/lshw /usr/share/man/man1/lshw.1.gz
Jacek
źródło
3

W powłoce TENEX C, tcsh , można wyświetlić listę lokalizacji polecenia lub, jeśli jest to polecenie wbudowane, za pomocą wherepolecenia np:

tcsh% where python
/usr/local/bin/python
/usr/bin/python

tcsh% where cd
cd is a shell built-in
/usr/bin/cd
Pierz
źródło
0

Powłoka Korn kshoferuje whencewbudowaną funkcję , która identyfikuje inne elementy wbudowane powłoki, makra itp. whichPolecenie jest jednak bardziej przenośne.

mpez0
źródło
1
W ksh whence -ajest podobny do Basha type -a.
Wstrzymano do odwołania.
0

Alternatywa dla type -ajestcommand -V

Ponieważ przez większość czasu interesuje mnie tylko pierwszy wynik, również piszczę z głowy. W ten sposób ekran nie zostanie zalany kodem w przypadku funkcji bash.

command -V lshw | head -n1
Marinos An
źródło