Warum muss ich immer "./" vor einer ausführbaren Datei eingeben, um sie unter Linux auszuführen?

8

Wenn ich egxc kompiliere von:

GCC x.c -o x

Um das Ergebnis auszuführen, muss ich schreiben:

./x

Und einfach tippen:

x

Schlägt mit dieser Meldung fehl:

x: Befehl nicht gefunden

Dies bedeutet, dass Linux das aktuelle Verzeichnis nicht danach durchsucht! Gibt es (ich bin sicher, dass es das gibt) ein vernünftiges Problem hinter diesem Verhalten?

Yasser Zamani
quelle
Weil es die Regeln sind.
Daniel R Hicks
@DanH: Dann erkläre bitte "die Regeln".
Torben Gundtofte-Bruun

Antworten:

13

Da sich das aktuelle Arbeitsverzeichnis standardmäßig nicht in der PATHVariablen befindet.

Dies ist eine Sicherheits- / Komfortmaßnahme. Wenn Sie Binärdateien / Scripts aufgerufen zB cd, lsusw. in Ihrem aktuellen Arbeitsverzeichnis, wäre es sehr ärgerlich, wenn sie standardmäßig ausgeführt wurde.

Oliver Charlesworth
quelle
4
Die Antwort ist nur teilweise richtig. Das Problem könnte auftreten, wenn das aktuelle Verzeichnis nur als letzte Option verwendet wird. Dann würden immer noch zuerst Standardwerkzeuge gefunden.
Benutzer unbekannt
1
Auch Shell builtins precendence nehmen (dh bei der Eingabe cdin bash, führt er eine Routine intern bash und nicht /bin/cd) , wenn Sie prepend mit `.`
LawrenceC
3
Als eine der ursprünglichen * nix-Sicherheitsmaßnahmen wird die Ausführung von vom System oder Administrator kompilierten Binärdateien erzwungen, die im vom System zugewiesenen Pfadbefehl enthalten sind. Nichts ist so schlimm wie jemand, der sich als Root bei einer Helpdesk-Frage anmeldet, in ein Benutzerverzeichnis wechselt, ls eingibt und feststellt, dass er eine von einem Benutzer hinterlassene Bombe geladen hat.
Fiasko Labs
7
@userunknown: Und beim ersten Tippfehler slhast du das gleiche Problem. Es sollten nur vertrauenswürdige Verzeichnisse sein $PATHund relative Pfade wie .sind nie ein vertrauenswürdiges Verzeichnis für eine interaktive Shell.
2
@Basic: Wenn ich tippe, rm -r targetals ich meinte, rm -f targetgibt es normalerweise keinen Unterschied. Wenn ich tippe, rm -f targetwenn ich es gemeint habe rm -r target, gibt es entweder keinen Unterschied oder die Entfernung schlägt fehl. Darüber hinaus denke ich jedes Mal vor dem Typ I rm, vor allem , wenn ich hinzufüge -foder -roder ein glob - es ist ein gefährlicher Befehl durch seine Natur. Niemand denkt nach, bevor er geht ls.
1

Dies bedeutet, dass sich das aktuelle Verzeichnis nicht in der Variablen $ PATH befindet.

James
quelle
1

Sie können dies beheben, indem Sie der PATHUmgebungsvariablen das aktuelle Verzeichnis (dargestellt durch einen einzelnen Punkt) hinzufügen .
Die Vorgehensweise hängt von der verwendeten Shell ab.
Wenn Sie bash verwenden, können Sie die Zeile export PATH=$PATH:.zur .bashrcDatei in Ihrem Home-Verzeichnis hinzufügen .
Wenn Sie csh oder tcsh verwenden, fügen Sie die Zeile set PATH = ($PATH .)zur Datei .cshrc in Ihrem Home-Verzeichnis hinzu.
IMHO, für einen Heim-Desktop-Computer ist dies eine akzeptable Sache - sicherheitstechnisch.

Kroiz
quelle
Ich wusste nicht, dass wir hinzufügen können. Dies führt jedoch zu einer Verringerung der Sicherheit, oder?
Yasser Zamani