Kiedy plik jest wykonywany, w jaki sposób Unix go szuka? Jeśli w PATH znajduje się wiele plików wykonywalnych o tej samej nazwie, który z nich jest preferowany? Czy bieżący katalog jest uwzględniany podczas wyszukiwania pliku?
Załóżmy, że executable.sh
w bieżącym katalogu znajduje się plik o nazwie . Czy to zadziałałoby, gdyby zostało wykonane $ executed
i .
nie jest częścią PATH
?
which <executable>
polecenia będzie przydatne w tym wątku.Odpowiedzi:
$ PATH jest przeszukiwany od początku do końca, uruchamiany jest pierwszy zgodny plik wykonywalny. Tak więc katalogi na początku $ PATH mają pierwszeństwo przed katalogami, które pojawią się później. Pliki wykonywalne w bieżącym katalogu (.) Są wykonywane tylko wtedy, gdy. jest w $ PATH (co zwykle nie jest ). Nie ma domyślnego włączenia bieżącego katalogu do ścieżki wyszukiwania.
źródło
.
, ale wygląda na to, że najpierw przeszukałby bieżący katalog, a potem katalogi kontrolne zdefiniowane w $ PATH.W przypadku plików w bieżącym katalogu należy je poprzedzić
./
, aby komenda stała się./executable.sh
. Nigdy nie powinieneś mieć.
w swojej ŚCIEŻCE, ponieważ stwarza to zagrożenie bezpieczeństwa, między innymi problemy.Katalogi, które są pierwsze w ŚCIEŻCE i wyszukiwane jako pierwsze.
Ogólny porządek na poszukiwania jest podobny do tego, jeśli dobrze pamiętam:
aliasy
eksportowane funkcje
wbudowane polecenia powłoki
skrypty i pliki binarne w ŚCIEŻCE
źródło
hash -r
), jeśli zmienisz ŚCIEŻKĘ lub lokalizację programu.Chociaż niektórzy inni dobrze na to odpowiedzieli, chciałbym dodać kilka przemyśleń:
1) PATH jest sprawdzane tylko wtedy, gdy wywoływany plik wykonywalny nie zawiera elementów ścieżki. somecommand będzie wyglądał w $ PATH,
./somecommand
lub/usr/bin/somecommand
, czy../../bin/somecommand
tylko zasady katalogów używają, nie PATHZatrzymuje się przy pierwszym znalezionym, odczytując $ PATH od lewej do prawej.
Jeśli bieżący katalog znajduje się w zmiennej PATH, wówczas jest przeszukiwany. Pamiętaj, że pusty katalog w zmiennej PATH zawiera katalog bieżący. np. PATH =: / usr / bin (wiodący pusty) PATH = / usr / bin: (końcowy pusty) i PATH = / usr / bin :: / bin (środkowy pusty) wszystko efektywnie obejmie bieżący katalog roboczy.
Nie znalazłby go, wyszukując ŚCIEŻKĘ. Jeśli bieżący katalog nie znajduje się w ŚCIEŻCE, nie znajdzie go podczas wyszukiwania ŚCIEŻKI.
To powiedziawszy (i przepraszam za zamieszanie), jeśli istnieje alias lub funkcja, która uruchamia polecenie, zostanie uruchomione. Lub jeśli twoja powłoka ma pamięć podręczną lokalizacji, a plik wykonywalny znajduje się w pamięci podręcznej, może ją znaleźć. Tak więc nigdy nie znajdzie go w ŚCIEŻCE, ale może być uruchamiany w inny sposób.
źródło
cache
notatkę, prawie doprowadza mnie do szału, że stary plik wykonywalny/usr/bin/
jest nadal wywoływany, a nie nowy w/usr/local/bin
, ale jest po lewej stronie,$PATH
aż wylogowałem się i zalogowałem ponownie.Aby zobaczyć, jaka jest obecnie twoja ścieżka, po prostu wpisz
echo $PATH
lubprintenv PATH
.Wtedy poznasz kolejność wyszukiwania. Jeśli masz wiele plików o tej samej nazwie, po prostu uruchom który ____, aby zobaczyć.
Dawny.
fajnym sposobem na znalezienie plików, które działają jak twój cel, jest użycie apropos:
i tak dalej...
źródło
whereis
używa zakodowanej listy lokalizacji, a nie$PATH
.@ coneslayer - Domyślna kolejność wyszukiwania plików wykonywalnych to bieżąca ścieżka, wbudowane polecenia, a następnie $ PATH. Więc jeśli funkcja o nazwie wykonywalnej już istnieje w pwd, to jest wykonywana. Jeśli nie to pierwszeństwo szuka wbudowanych poleceń powłoki, a następnie $ PATH
źródło
./
), przeszukuje tylko ten katalog; w przeciwnym razie wyszukuje$PATH
.