Was ist der Unterschied zwischen dem Ausführen einer ausführbaren Datei nur nach Namen und dem Anhängen eines Punkts / Schrägstrichs davor?

13

Dies ist die Ausgabe von ls -allBefehl:

-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 ./jdevstarte als ... Warum ist es so?

Aussenseiter
quelle

Antworten:

20

Wenn Sie eine ausführbare Datei (oder besser gesagt in der Unix / Linux-Welt - eine Datei mit ausführbaren Rechten / Flag an) wie folgt ausführen:

$ ./jdev

Sie markieren dann mit, .dass Sie eine Datei in Ihrem Arbeitsverzeichnis (Verzeichnis, in dem Sie sich gerade befinden) ausführen möchten, die benannt ist jdevund über ausführbare Rechte für den Benutzer verfügt, der sie startet (Sie müssen beachten, dass es weiterhin eine Verknüpfung zu sein kann andere Datei können Sie überprüfen, indem Sie ls -l jdevim Terminal eingeben )

(siehe Dateiberechtigungen unter Linux / Unix )

Wenn Sie es als ausführen

$ jdev

dann ist höchstwahrscheinlich jdevirgendwo auf dem System installiert und Sie haben es in $PATH(zB /usr/bin/oder /bin/oder /usr/local/bin/)

Wie peterph schon sagte: Mit können Sie whichauf die ausführbare Datei verweisen, die mit einem bestimmten Befehl gestartet wird, z.

$ which find
/usr/bin/find
Patryk
quelle
1
Auch nicht, dass das whichDienstprogramm Ihnen mitteilen kann, welche ausführbare Datei verwendet wird, wenn kein Pfad angegeben wird.
Peterph
@ Peterph Bearbeitet meine Antwort.
Patryk
7
Es ist viel besser zu typeüberprüfen, was von einem bestimmten Befehl gestartet wird. Cause whichzeigt Ihnen nur eine Binärdatei irgendwo im $ PATH an, es kann jedoch auch eine Alias-Datei für eine absolut andere Binärdatei sein.
Ansturm
@rush ich gerade versucht, und es wird nicht funktionieren , wie Sie sagen: [~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim. Währendzsoelim -> soelim
Patryk
2
@ Patryk Ich denke, Rush meinte die Shell-Aliase / -Funktionen, die whichkeine 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).
Peterph
8

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 $PATHUmgebungsvariablen 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. ./fooist das offensichtlichste. Sie können auch den vollständigen Pfad verwenden oder ../dir/foo...

Verwenden Sie den typeBefehl , um zu erfahren, wie die Shell ausgeführt wird . Verwenden Sie nicht den whichBefehl, der im Allgemeinen nicht das tut, was Sie denken, und der ein Erbe ist, von cshdem man ihn besser in Ruhe lässt.

Stéphane Chazelas
quelle
Warum nicht "welches", sondern "Typ"?
Geek
@Geek, das ist eine FAQ hier, siehe unix.stackexchange.com/search?q=[which[+type
Stéphane Chazelas
Hast du den richtigen Link angegeben?
Geek
Dies ist ein Suchergebnis auf dieser Website, um zu beweisen, dass es sich um eine häufig gestellte Frage handelt. Viele Antworten auf diese Fragen geben Aufschluss darüber, warum Sie sie nicht verwenden sollten which. Siehe zum Beispiel unix.stackexchange.com/questions/16693/…
Stéphane Chazelas
2

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:

[ 0:04:08 ] afsin@s15426859:~ % pwd
/home/afsin
[ 0:04:30 ] afsin@s15426859:~ % which who
/usr/bin/who
[ 0:04:47 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:27 ] afsin@s15426859:~ % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/afsin/bin
[ 0:05:31 ] afsin@s15426859:~ % touch who
[ 0:05:40 ] afsin@s15426859:~ % chmod +x who
[ 0:05:47 ] afsin@s15426859:~ % ls -al who
-rwxr-xr-x 1 afsin afsin 0 23. Jan 00:05 who
[ 0:05:50 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:55 ] afsin@s15426859:~ % export PATH=$PATH:.
[ 0:06:09 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:14 ] afsin@s15426859:~ % alias who=who
[ 0:06:19 ] afsin@s15426859:~ % where who
who: aliased to who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:22 ] afsin@s15426859:~ % which who
who: aliased to who
[ 0:06:27 ] afsin@s15426859:~ %
Afsin Toparlak
quelle
1

Obwohl dies wahrscheinlich von Ihrer Shell abhängt, lautet die Regel normalerweise:

  • Wenn Sie einen relativen oder absoluten Pfad angeben, wird dieser Pfad verwendet. ./jdevist ein relativer Pfad, da .steht für das aktuelle Verzeichnis (in der Tat ls -all .würde Ihnen das gleiche geben wie ls -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 $PATHnach 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 $PATHimmer 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, da ls, wenn es damit $PATHanfängt ., ein einfacher ls -lahBefehl ausreicht, um Ihr System anzugreifen.

njsg
quelle
Ihre Terminologie ist verwirrend. jdevallein ist auch ein relativer Weg. Die Regel lautet: Wenn es keinen Schrägstrich enthält, wird es in Aliasen, Funktionen und $PATHansonsten direkt im Dateisystem nachgeschlagen (obwohl einige Shells Aliase oder Funktionen mit / in ihrem Namen zulassen, die dann erforderlich wären) Vorrangstellung).
Stéphane Chazelas