Jak używać tego polecenia w systemie Linux

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

Plik

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

Plik

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

Plik

Teraz spróbujmy uruchomić program, wpisując:

htg

Plik

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

Plik

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

Plik

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

Plik

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

Plik

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

Plik

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

Plik

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