Ich habe mich gefragt, was in der folgenden Situation passiert. Angenommen, ich habe eine ausführbare Datei in einem Verzeichnis, das sich in PATH in .bashrc befindet. Wenn ich die Datei in ein anderes Verzeichnis kopiere, das ebenfalls in PATH festgelegt ist, und diese Datei vom Terminal aus ausführe, welche Kopie führe ich dann aus?
Kann ich eine Präferenz festlegen, die besagt: „Wenn eine Datei an mehr als einer Stelle innerhalb von PATH vorhanden ist, führe diese an erster Stelle aus, statt an zweiter.“
Antwort1
Die schnelle Antwort
Um herauszufinden, welche Kopie bash
ausgeführt werden soll, verwenden Sie das in Bash integrierte Dienstprogramm . Um beispielsweise type
herauszufinden, welche Kopie von ausgeführt wird, führen Sie Folgendes aus:du
$ type du
du is /usr/bin/du
Die Theorie
Wenn Sie bash
die Ausführung von etwas anfordern, bash
werden zwei Schritte ausgeführt:
Zunächst wird der Speicherort der Datei im Cache gesucht. Dabei handelt es sich um eine Liste mit den Namen ausführbarer Dateien und dem Speicherort der Datei bei ihrer letzten Ausführung bash
.
Zweitens: Wenn sich die Datei nicht im Cache befindet, wird der Pfad überprüft, wobei jedes Verzeichnis im Pfad von links nach rechts durchsucht wird.
Beachten Sie, dass die Antwort davon abhängt, ob Sie die ausführbare Datei zufällig in der aktuellen Shell ausgeführt haben, bevor Sie das Kopieren durchgeführt haben. Wenn ja, bash
haben Sie möglicherweise ihren Speicherort im Cache gespeichert und es wirdignorierenalle neuen Speicherorte, an denen sie sich nach dem Erstellen von Kopien befinden kann. Wenn sie sich nicht im Cache befindet, hängt die Ausführung der Datei nur von der Reihenfolge der Verzeichnisse im Pfad ab.
Mehr Details
Um zu sehen, was sich im aktuellen Cache von Bash befindet, führen Sie Folgendes aus:
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([du]="/usr/bin/du" )'
Oben sehen Sie, dass nur du
beim Ausführen mehr Befehle im Cache waren. Wenn ich weitere Befehle ausgeführt und es dann erneut ausgeführt hätte, wäre mehr im Cache.
Um den aktuellen Pfad anzuzeigen, führen Sie Folgendes aus:
$ echo $PATH
/bin:/usr/bin:/opt/bin:/usr/local/bin:/usr/X11R6/bin
Der Pfad ist eine durch Doppelpunkte getrennte Liste. Oben sind fünf Verzeichnisse im Pfad aufgeführt. Sie werden von links nach rechts durchsucht.
Kann ich eine Präferenz festlegen?
Ja, Sie können die Reihenfolge der Verzeichnisse im Pfad ändern.
Alternativ können Sie für interaktives Arbeiten einen Alias festlegen. Beispiel:
$ alias dd=/opt/bin/dd
Nachdem der obige Alias festgelegt wurde, können Sie dd
in die Befehlszeile Folgendes eingeben, wodurch bash
der Cache und der PFAD ignoriert und ausgeführt werden (oder der Versuch unternommen wird, es auszuführen) /opt/bin/dd
.