Linux, które polecenie identyfikuje wykonywalny plik binarny, który jest uruchamiany po wydaniu polecenia powłoce. Jeśli masz różne wersje tego samego programu na swoim komputerze, możesz użyć którejś z nich, aby dowiedzieć się, której z nich będzie używać powłoka.
Pliki binarne i ścieżki
Kiedy próbujesz uruchomić program lub polecenie z okna terminala, powłoka (zwykle Grzmotnąć w nowoczesnych dystrybucjach) musi znaleźć to polecenie i uruchomić je. Niektóre polecenia, takie jak Płyta CD, historia, i pwd, są wbudowane w powłokę, więc Bash nie musi zbyt ciężko pracować, aby je znaleźć.
Ale w jaki sposób Bash lokalizuje inne polecenia, programy i zewnętrzne niezależne pliki binarne? Cóż, Bash używa ścieżki, która jest w rzeczywistości zbiorem ścieżek, z których każda wskazuje na katalog. Następnie przeszukuje każdy z tych katalogów w poszukiwaniu pliku wykonywalnego, który pasuje do polecenia lub programu, który próbujesz uruchomić. Kiedy znajdzie taki, Bash uruchamia go i porzuca wyszukiwanie.
Możesz użyć echo, aby sprawdzić zmienną środowiskową $ PATH i zobaczyć katalogi w swojej ścieżce. Aby to zrobić, wpisz następujące polecenie, a następnie naciśnij Enter:
echo $PATH
Lista wyjściowa oddziela każdą ścieżkę dwukropkami (:). Na używanym przez nas komputerze Bash przeszuka następujące katalogi w następującej kolejności:
/ usr / local / sbin
/ usr / local / bin
/ usr / sbin
/ usr / bin
/ sbin
/kosz
/ user / games
/ usr / local / games
/ snap / bin
W systemie plików znajduje się wiele folderów o nazwach / sbin i / bin, co może prowadzić do nieporozumień.
Obserwuj te ścieżki
Powiedzmy, że mamy zaktualizowaną wersję programu o nazwie htg. Znajduje się w naszym bieżącym katalogu i możemy go uruchomić, wpisując następujące polecenie:
./htg
To niewiele programu – po prostu wypisuje numer wersji, a następnie zamyka. Nowa wersja to 1.2.138.
Aby uruchomić program w bieżącym katalogu roboczym, musisz wpisać „./” przed nazwą programu, aby Bash wiedział, gdzie go znaleźć.
Ponieważ chcemy uruchomić ten konkretny program z dowolnego katalogu, zamierzamy przenieść plik wykonywalny do katalogu / usr / bin. Bash znajdzie ten program na ścieżce i uruchomi go za nas.
Nie potrzebujemy pliku wykonywalnego w naszym bieżącym katalogu ani nie musimy wpisywać „./” przed nazwą programu, jak pokazano poniżej:
sudo mv htg /usr/bin
Teraz spróbujmy uruchomić program, wpisując:
htg
Coś działa, ale to nie jest nasz nowy, zaktualizowany program. Jest to raczej starsza wersja 1.2.105.
Które polecenie
Problem, który zademonstrowaliśmy powyżej, dotyczy tego, które polecenie był zaprojektowany.
W tym przykładzie użyjemy which i przekażemy nazwę programu, który badamy, jako parametr wiersza polecenia:
which htg
który zgłasza, że znalazł wersję htg w katalogu / usr / local / bin. Ponieważ ta lokalizacja pojawia się w ścieżce przed katalogiem, do którego przenieśliśmy zaktualizowany htg, Bash używa wcześniejszej wersji programu.
Jeśli jednak użyjemy opcji -a (all), jak pokazano poniżej, która kontynuuje wyszukiwanie, nawet jeśli znajdzie dopasowanie:
which -a htg
Następnie wyświetla listę wszystkich dopasowań w dowolnym katalogu w ścieżce.
A więc w tym problem – w katalogu, który również znajduje się w poprawce, znajduje się wcześniejsza wersja programu. A ten katalog jest przeszukiwany przed katalogiem, do którego wrzuciliśmy nową wersję programu.
Aby zweryfikować, możemy wpisać następujące polecenie i jawnie uruchomić każdą wersję programu:
/usr/local/bin/htg
/usr/bin/htg
To wyjaśnia problem, a rozwiązanie jest proste.
Właściwie mamy opcje. Możemy albo usunąć starą wersję z katalogu / use / local / bin, albo przenieść ją z / usr / bin do / usr / local / bin.
Obejrzyj te wyniki
Dwa wyniki niekoniecznie oznaczają dwa pliki binarne.
Spójrzmy na przykład, w którym użyjemy polecenia which z opcją -a (all) i poszukamy wersji programu less:
which -a less
który podaje dwie lokalizacje, w których znajduje się wersja programu less, ale czy to prawda? Byłoby dziwne mieć dwie różne wersje (lub tę samą wersję w wielu lokalizacjach) mniej zainstalowaną na komputerze z systemem Linux. Więc nie będziemy akceptować danych wyjściowych, z których. Zamiast tego poszukajmy nieco głębiej.
Możemy użyć opcji ls, -l (długa lista) i -h (czytelna dla człowieka), aby zobaczyć, co się dzieje:
ls -lh /usr/bin/less
Rozmiar pliku jest zgłaszany jako dziewięć bajtów! To zdecydowanie nie jest pełna kopia less.
Pierwszy znak na liście to „l”. Zwykły plik miałby myślnik (-) jako pierwszy znak. Litera „l” to symbol oznaczający dowiązanie symboliczne. Jeśli przegapiłeś ten szczegół, symbol -> również wskazuje, że jest to plik dowiązanie symboliczne, który można traktować jako rodzaj skrótu. Ten wskazuje na kopię less in / bin.
Spróbujmy ponownie z wersją less in / bin:
ls -lh /bin/less
Ten wpis jest oczywiście „prawdziwym” binarnym plikiem wykonywalnym. Pierwszy znak na liście to myślnik (-), co oznacza, że jest to zwykły plik, a rozmiar pliku to 167 KB. Tak więc zainstalowana jest tylko jedna kopia less, ale istnieje dowiązanie symboliczne do niej z innego katalogu, które Bash również znajduje, przeszukując ścieżkę.
Sprawdzanie wielu poleceń jednocześnie
Możesz przekazać wiele programów i poleceń do których, a to sprawdzi je w kolejności.
Na przykład, jeśli wpiszesz:
which ping cat uptime date head
który działa na liście programów i poleceń, z którymi go dostarczyłeś i wyświetla wyniki dla każdego z nich.
Który który jest który?
Jeśli masz taką ochotę, możesz również użyć tego samego, wpisując:
which which
Oprócz grzebania w systemie plików Linuksa z ciekawości, co jest najbardziej przydatne, gdy oczekujesz jednego zestawu zachowań od polecenia lub programu, ale otrzymujesz inny.
Możesz użyć tego w takich przypadkach, aby sprawdzić, czy polecenie uruchamiane przez Bash jest tym, którego chcesz użyć.