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ś?

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).


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 

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

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

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

0

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.