Warum verwenden wir "./", um eine Datei auszuführen?

84

Warum verwenden wir ./filename, um eine Datei unter Linux auszuführen?

Warum geben Sie nicht einfach wie andere Befehle gcc, lsetc ...

Renjith G
quelle
Wäre die erste Zeile nicht besser geschrieben als "Warum führen wir ./command_nameeinen Befehl unter Linux aus?"

Antworten:

78

Unter Linux bezeichnet UNIX und verwandte Betriebssysteme .das aktuelle Verzeichnis. Da Sie eine Datei in Ihrem aktuellen Verzeichnis ausführen möchten und dieses Verzeichnis sich nicht in Ihrem befindet $PATH, benötigen Sie das ./Bit, um der Shell mitzuteilen, wo sich die ausführbare Datei befindet. Das ./fooheißt, Sie führen die aufgerufene ausführbare Datei aus foo, die sich in diesem Verzeichnis befindet.

Sie können typeoder verwenden which, um den vollständigen Pfad aller Befehle in Ihrem abzurufen $PATH.

badp
quelle
5
Es ist sehr üblich, Programme im aktuellen Verzeichnis auszuführen. Warum sucht die Shell dort nicht auch? Es sucht zuerst in., Dann in $ PATH.
Michael
es gibt auch aliases, die im weg stehen können, nicht nur $PATH.
user2485710
18
@Michael Sicherheit und Vernunft: Wenn es zuerst durchsucht wird, handelt .es sich um ein Sicherheitsproblem, das Sie oder eine andere Person lsbeispielsweise ersetzen könnten (ein einfacher Virus / Trojaner: Erstellen Sie eine Zip-Datei mit einer darin genannten ausführbaren Datei , während eine andere lsPerson sucht , sie führen diese ausführbare Datei aus, die…). Wenn es zuletzt durchsucht wurde ., können Sie lange Zeit verrückt werden, ohne zu wissen, warum Ihr Programm nicht funktioniert (z. B. erstellen Sie ein Programm mit dem Namen test, statt Ihr Programm auszuführen, wird das Systemtestprogramm ausgeführt. Dies erzeugt keine Ausgabe).
Strg-Alt-Delor
Es stellt auch sicher, dass Sie die Version ausführen, die Sie ausführen möchten (die hier in Ihrem "." - Verzeichnis), wenn die Anwendung oder das Skript mehrmals in Ihrem Pfad vorkommt.
Jim2B
Sie können ausführen export PATH="$PATH:."Befehl in der aktuellen Verzeichnis auszuführen , wenn nicht an anderer Stelle in PATH gefunden, können Sie dies in Ihrer .bashrc Datei hinzufügen können
jcubic
99

Die wörtliche Antwort lautet wie von anderen angegeben: weil sich das aktuelle Verzeichnis nicht in Ihrem befindet $PATH.

Aber warum? Kurz gesagt, es dient der Sicherheit. Wenn Sie im Home-Verzeichnis (oder / tmp) einer anderen Person suchen und nur gccoder eingeben, lsmöchten Sie wissen, dass Sie die echte Version ausführen, nicht eine bösartige Version, die Ihr Prankster-Freund geschrieben hat und die alle Ihre Dateien löscht. Ein anderes Beispiel wäre testoder [, das diese Befehle in Shell-Skripten überschreiben könnte, wenn Ihre Shell diese nicht als integrierte Befehle enthält.

Nachdem .als letzte in Ihrem Pfad Eintrag ist ein wenig sicherer, aber es gibt auch andere Angriffe , die Verwendung davon machen. Eine einfache Möglichkeit besteht darin, gängige Tippfehler wie sloder auszunutzen ls-l. Oder suchen Sie einen allgemeinen Befehl, der zufällig nicht auf diesem System installiert ist - vimzum Beispiel, weil Sysadmins mit überdurchschnittlicher Wahrscheinlichkeit diesen Befehl eingeben.

mattdm
quelle
5
Ein praktisches Beispiel dafür, wie jemand davon etwas mitbekommt
mattdm
Habe nur absolute Pfade in der PATHUmgebungsvariablen.
Ed Heal
45

Wenn Sie meinen, warum brauchen Sie ./ am Anfang - das liegt daran, dass (im Gegensatz zu Windows) das aktuelle Verzeichnis standardmäßig nicht in Ihrem Pfad enthalten ist. Wenn du läufst:

$ ls

Ihre Shell sucht lsin den Verzeichnissen in Ihrer PATH-Umgebungsvariablen nach ( echo $PATHum sie anzuzeigen ) und führt die erste ausführbare Datei aus ls, die sie findet. Wenn Sie Folgendes eingeben:

$ a.out

Die Shell funktioniert genauso - findet aber wahrscheinlich keine ausführbare Datei mit dem Namen a.out. Sie müssen der Shell mitteilen, wo sich a.out befindet - es befindet sich im aktuellen Verzeichnis (.), Dann lautet der Pfad ./a.out.

Wenn Sie fragen, warum es "a.out" heißt, ist dies nur der Standardname der Ausgabedatei für gcc. Sie können es mit dem Befehlszeilenargument -o ändern. Zum Beispiel:

$ gcc test.c -o test
$ ./test
Simon Whitaker
quelle
Vielen Dank. Ich bezweifle, warum Sie ./ am Anfang brauchen. Ich habe die Verwendung von "." (um das aktuelle Verzeichnis zu speichern) aber warum "/" danach?
Renjith G
8
/ ist das Pfadtrennzeichen in Linux, sodass Sie es verwenden, um das Verzeichnis (.) vom Dateinamen (a.out) zu trennen. Ohne sie haben Sie .a.out, das für sich genommen ein gültiger Dateiname ist. (Versuchen Sie dies touch .a.out; ls -lAzu sehen.)
Simon Whitaker
5
Auf diese Weise geben Sie den Pfad in Unix an, <dir>/<file>sodass Sie im Grunde genommen sagen , dass Sie eine Datei im aktuellen Verzeichnis ausführen, das durch./test
Rohan Monga
Red Hat Linux Release 9 (Shrike) Kernel 2.4.20-8 auf einem i686-Computer [renjithg @ cvsserver renjithg] $ touch .a.out; ls -lA total 3 -rw-rw-r-- 1 renjithg renjithg 0 Nov 30 13 : 46.a.out -rwxrwxr-x 1 Renjithg Renjithg 11669 30. November 13:46 a.out -rw-rw-r-- 1 Renjithg Renjithg 218 24. August 2009 aray.c [Renjithg @ cvsserver Renjithg] $
Renjith G
3
Red Hat Linux 9? Zeit für ein Upgrade!
Mattdm
4

Sie können versuchen :., Ihrer $ PATH-Variablen etwas hinzuzufügen .

Versuchen Sie ALT + F2 und geben Sie Folgendes ein: gksudo gedit /etc/environmentwenn Sie Linux / GTK ausführen (dies ist das, was Sie haben, wenn Sie Ubuntu verwenden).

Ich rate Ihnen jedoch dringend, dies NICHT zu tun. Es ist schlimm, schlimm, schlimm und schlimm.

Sie wissen, dass solche Dinge seit 1970 so funktionieren. Es gibt einen Grund, warum das aktuelle Verzeichnis nicht in $ PATH enthalten ist.

. ist das aktuelle Verzeichnis

.somethingwäre eine versteckte Datei (Tippe "ALT +", um sie in Nautilus erscheinen zu lassen, oder versuche " ls -la".

./someProgram.sh Geben Sie Folgendes ein, um eine ausführbare Datei someProgram.sh im aktuellen Verzeichnis AUSZUFÜHREN.

.somethingElse würde bedeuten, dass Sie eine versteckte ausführbare Datei im aktuellen Verzeichnis haben, was eine schlechte Idee ist.

tiktak
quelle