Wie sucht Unix nach einer ausgeführten Datei? Wenn sich in PATH mehrere ausführbare Dateien mit demselben Namen befinden, welche wird bevorzugt? Ist das aktuelle Verzeichnis in der Suche enthalten, wenn eine Datei ausgeführt wird?
Angenommen, executable.sh
im aktuellen Verzeichnis befindet sich eine Datei mit dem Namen . Würde das funktionieren, wenn es ausgeführt wird $ executed
und .
nicht Teil des ist PATH
?
which <executable>
Befehl wird in diesem Thread nützlich sein.Antworten:
$ PATH wird von Anfang bis Ende durchsucht, wobei die erste übereinstimmende ausführbare Datei ausgeführt wird. Daher haben Verzeichnisse am Anfang von $ PATH Vorrang vor den später hinzukommenden Verzeichnissen. Ausführbare Dateien im aktuellen Verzeichnis (.) Werden nur ausgeführt, wenn. ist in $ PATH (was normalerweise nicht der Fall ist ). Es gibt keine implizite Einbeziehung des aktuellen Verzeichnisses in den Suchpfad.
quelle
.
, aber es scheint, als würde zuerst nach dem aktuellen Verzeichnis gesucht, bevor in $ PATH selbst definierte Verzeichnisse überprüft werden.Bei Dateien im aktuellen Verzeichnis müssen Sie diesen voranstellen
./
, damit der Befehl zu wird./executable.sh
. Sie sollten unter keinen Umständen.
in Ihrem PFAD sein, da dies unter anderem ein Sicherheitsrisiko darstellt.Verzeichnisse, die im PATH an erster Stelle stehen und zuerst durchsucht werden.
Die Gesamtreihenfolge für die Suche ist wie folgt, wenn ich mich richtig erinnere:
Aliase
exportierte Funktionen
eingebaute Shell-Befehle
Skripte und Binärdateien in Ihrem PATH
quelle
hash -r
), wenn Sie den Pfad oder die Programmposition ändern.Obwohl dies von einigen anderen gut beantwortet wurde, möchte ich einige Gedanken hinzufügen:
1) PATH wird nur abgefragt, wenn die aufgerufene ausführbare Datei keine Pfadelemente enthält. einKommando würde in $ PATH nachgeschlagen,
./somecommand
oder/usr/bin/somecommand
, oder../../bin/somecommand
nur Gebrauch Verzeichnis Regeln, nicht PATHEs stoppt beim ersten gefundenen und liest $ PATH von links nach rechts.
Befindet sich das aktuelle Verzeichnis in PATH, wird es durchsucht. Denken Sie daran, dass ein leeres Verzeichnis in PATH das aktuelle Verzeichnis enthält. Beispiel: PATH =: / usr / bin (leer) PATH = / usr / bin: (leer am Ende) und PATH = / usr / bin :: / bin (leer in der Mitte) enthalten effektiv das aktuelle Arbeitsverzeichnis.
Es würde es nie finden, wenn es PATH durchsucht. Wenn sich das aktuelle Verzeichnis nicht in PATH befindet, wird es bei einer PATH-Suche nicht gefunden.
Das heißt (und es tut mir leid, um Verwirrung zu stiften), wenn es einen Alias oder eine Funktion gibt, die den Befehl ausführt, wird er ausgeführt. Oder wenn Ihre Shell einen Location-Cache hatte und sich die ausführbare Datei im Cache befand, wird sie möglicherweise gefunden. Es wird es also niemals in PATH finden, aber es kann auf andere Weise ausgeführt werden.
quelle
cache
Hinweis, es macht mich fast verrückt, dass die alte ausführbare Datei/usr/bin/
immer noch aufgerufen wird, nicht die neue./usr/local/bin
Sie befindet sich jedoch links in der$PATH
Liste, bis ich mich abgemeldet und wieder angemeldet habe.Um zu sehen, was Ihr Pfad gerade ist
echo $PATH
, geben Sie oder einprintenv PATH
.Dann kennen Sie die Reihenfolge der Suche. Wenn Sie mehrere Dateien mit demselben Namen haben, führen Sie einfach die ____ aus, um sie anzuzeigen.
Ex.
Eine coole Möglichkeit, Dateien zu finden, die wie Ihr Ziel funktionieren, ist die Verwendung von apropos:
und so weiter...
quelle
whereis
verwendet eine fest codierte Liste von Standorten, nicht$PATH
.@ coneslayer- Die Standardreihenfolge für die Suche nach ausführbaren Dateien ist der aktuelle Pfad, die eingebauten Befehle und dann $ PATH. Wenn also eine Funktion mit dem Namen executable bereits in der pwd vorhanden ist, wird diese ausgeführt. Wenn dies nicht der Fall ist, sucht die Rangfolge nach eingebauten Befehlen der Shell und dann nach $ PATH
quelle
./
) einen Pfad angeben , wird nur dieses Verzeichnis durchsucht. Andernfalls wird gesucht$PATH
.