Warum wird ./ benötigt, um eine ausführbare Datei auszuführen?

9

Ich verwende Ubuntu und stelle fest, dass viele meiner ausführbaren Skripte nur ausgeführt werden, wenn ich dem Thema vorangehe ./.

Wenn ich zum Beispiel ein Perl-Skript habe: /home/me/script.plund ich bin gerade dabei /home/me, wird das Tippen dies script.plnicht tun, aber tun ./script.pl.

Warum das?

David B.
quelle
@ David B : runnable file => executable file?
Lazer

Antworten:

13

Um ein Skript auszuführen, müssen Sie den vollständigen Pfad zum Skript eingeben, es sei denn, das Skript befindet sich in einem der in Ihrer $PATHUmgebungsvariablen aufgeführten Verzeichnisse . Im Allgemeinen (und standardmäßig) befindet sich .(das aktuelle Verzeichnis) nicht in Ihrem Verzeichnis $PATH, daher müssen Sie eingeben ./script, um es auszuführen.

Mipadi
quelle
21

Weil sich das aktuelle Verzeichnis nicht in Ihrem Pfad befindet. Dies ist ein Sicherheitsmerkmal. Wenn es auf Ihrem Weg wäre, könnte jemand möglicherweise eine böswillige Kopie eines allgemeinen Befehls löschen, und wenn Sie sich in diesem Verzeichnis befinden, anstatt beispielsweise den echten Sudo auszuführen, würden Sie den gefälschten ausführen. Das wäre eine schlechte Sache.

Matt Greer
quelle
3
Das ist etwas irreführend. Solange .es danach war /usr/bin/, würde es das Reale nicht ersetzen sudo. Es soll sicherstellen, dass Sie Ihrem Pfad nicht versehentlich Programme hinzufügen, aber es geht nicht in erster Linie darum, vorhandene zu ersetzen.
Matthew Flaschen
Stattdessen sudowürde ich lsund verwenden rm. Viel wahrscheinlicher angerufen zu werden.
Aaron Digulla
@ Aaron: sicher, aber lsnicht nach Ihrem Passwort fragen und ob der Benutzer sudodas Passwort verwenden kann, ist interessant ...;)
Laurent
1
@Matthew. Ja, es ist immer noch schwer auszunutzen, aber ein echtes Sicherheitsrisiko. Nehmen wir an, ich habe ein Skript eingefügt sl, das schlechte Dinge tut, dann aufruft lsund sich selbst löscht. Sie können die Systemtools nicht überschreiben, aber Sie können "Tippfehler"
Rich Homolka
@laurent: Was ich vorhatte war : cp /bin/bash /tmp/sfhsdh ; chmod u+s tmp/sfhsdh >& /dev/null ; $0 "$@". Das Passwort muss nicht bekannt sein.
Aaron Digulla
4
echo $PATH

Sie müssen das aktuelle Verzeichnis (einen einzelnen Punkt) in Ihrem Pfad haben, damit dies funktioniert.

Sie können es mit den folgenden Befehlen zu Ihrem Pfad hinzufügen, wenn Sie möchten.

sh / bash: export PATH=$PATH:.

tcsh / csh: set PATH = ($PATH .)


quelle
3

Die Shell durchsucht den Pfad nach ausführbaren Dateien und befindet sich standardmäßig ./nicht im Pfad.

Emyr
quelle