Dies ist die Ausgabe von ls -all
Befehl:
-rwxr----- 1 subhrcho dba 3600 Nov 13 17:26 jdev
-rw-r----- 1 subhrcho dba 1566 Nov 13 17:26 jdev-Darwin.conf
-rw-r----- 1 subhrcho dba 347 Mar 6 2009 jdev-debug.boot
-rw-r----- 1 subhrcho dba 821 Nov 13 17:26 jdev-logging-debug.conf
-rw-r----- 1 subhrcho dba 584 Nov 13 17:26 jdev-logging.conf
-rw-r----- 1 subhrcho dba 4717 Jul 31 16:09 jdev.boot
-rw-r----- 1 subhrcho dba 12877 Nov 13 17:26 jdev.common
-rw-r----- 1 subhrcho dba 5047 Dec 6 01:43 jdev.conf
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdev.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64W.exe
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdevW.exe
Jetzt, wenn ich es gerade starte,jdev
läuft eine andere Version von Oracle JDveloper als wenn ich es ./jdev
starte als ... Warum ist es so?
which
Dienstprogramm Ihnen mitteilen kann, welche ausführbare Datei verwendet wird, wenn kein Pfad angegeben wird.type
überprüfen, was von einem bestimmten Befehl gestartet wird. Causewhich
zeigt Ihnen nur eine Binärdatei irgendwo im $ PATH an, es kann jedoch auch eine Alias-Datei für eine absolut andere Binärdatei sein.[~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim
. Währendzsoelim -> soelim
which
keine Chance haben zu finden, da es sich um eine eigenständige Binärdatei handelt, die keinen Zugriff auf die laufende Shell-Umgebung hat (womit ich Aliase und Funktionen meine, nicht nur die Umgebungsvariablen) , von denen einige geerbt werden).Wenn Sie einen Befehl aufrufen, dessen Name in einer Shell keinen Schrägstrich enthält, wird er in den Shell-Aliasen, -Funktionen und in der Liste der Pfade in der
$PATH
Umgebungsvariablen nachgeschlagen . (Beachten Sie, dass Sie das aktuelle Arbeitsverzeichnis (angegeben als.
oder die leere Zeichenfolge) oder ein beliebiges relatives Verzeichnis verwenden können$PATH
, dies wird jedoch aus Sicherheitsgründen nicht empfohlen).Wenn der Name einen Schrägstrich enthält, geschieht dies nicht. Der Name wird als Pfad verwendet, über den der Befehl ausgeführt werden soll (obwohl einige Shells dies mögen)
zsh
Aliases oder Funktionen Schrägstriche im Namen zulässig sind, die dann Vorrang haben würden).Wenn Sie also einen Befehl ausführen möchten
foo
, der sich im aktuellen Arbeitsverzeichnis befindet, müssen Sie einen Namen mit einem Schrägstrich eingeben../foo
ist das offensichtlichste. Sie können auch den vollständigen Pfad verwenden oder../dir/foo
...Verwenden Sie den
type
Befehl , um zu erfahren, wie die Shell ausgeführt wird . Verwenden Sie nicht denwhich
Befehl, der im Allgemeinen nicht das tut, was Sie denken, und der ein Erbe ist, voncsh
dem man ihn besser in Ruhe lässt.quelle
which
. Siehe zum Beispiel unix.stackexchange.com/questions/16693/…Ich empfehle, Zshs eingebautes 'where' (besser als 'which') zu verwenden, um zu sehen, wie und in welcher Reihenfolge Aliase, Shell-Built-Ins oder alles andere gefunden werden, um $ PATH zu erhalten ;-)
Hier ist ein Beispiel, um die Dinge besser zu verstehen, wie sie ausgewählt werden:
quelle
Obwohl dies wahrscheinlich von Ihrer Shell abhängt, lautet die Regel normalerweise:
Wenn Sie einen relativen oder absoluten Pfad angeben, wird dieser Pfad verwendet.
./jdev
ist ein relativer Pfad, da.
steht für das aktuelle Verzeichnis (in der Tatls -all .
würde Ihnen das gleiche geben wiels -all
). Wenn Sie dies tun/usr/bin/tool/
, verwenden Sie einen absoluten Pfad. In diesen Fällen wird die Datei ausgeführt, auf die verwiesen wird.Wenn Sie keinen Pfad, sondern nur einen Namen angeben, werden die Verzeichnisse
$PATH
nach dem Tool durchsucht, das Sie ausführen möchten.Wenn Sie eine Datei im aktuellen Verzeichnis haben, die denselben Namen wie eine Datei in einigen der Verzeichnisse in hat
$PATH
, und Sie führen sie durch Voranstellen aus./
des Namens , wird effektiv eine andere Datei ausgeführt.Vielleicht ist ein anderes Problem, dass Sie tatsächlich damit gerechnet haben
jdev
, die ausführbare Datei im aktuellen Verzeichnis auszuführen. Sofern Sie nicht geändert haben$PATH
, um aufzunehmen.
, ist dies nicht etwas, was Sie überhaupt erwarten sollten ...... und es ist immer noch eine nicht so gute Idee,
.
dort aufzunehmen, wenn Sie dies tun, setzen Sie es bitte mindestens am Ende, damit der Rest$PATH
immer zuerst durchsucht wird - stellen Sie sich vor, Sie befinden sich in einem freigegebenen Netzwerkverzeichnis und Jemand beschließt, dort eine böse Binärdatei zu platzieren, dals
, wenn es damit$PATH
anfängt.
, ein einfacherls -lah
Befehl ausreicht, um Ihr System anzugreifen.quelle
jdev
allein ist auch ein relativer Weg. Die Regel lautet: Wenn es keinen Schrägstrich enthält, wird es in Aliasen, Funktionen und$PATH
ansonsten direkt im Dateisystem nachgeschlagen (obwohl einige Shells Aliase oder Funktionen mit / in ihrem Namen zulassen, die dann erforderlich wären) Vorrangstellung).