it-swarm.com.de

Warum verwenden wir "./" (Schrägstrich), um eine Datei unter Linux / UNIX auszuführen?

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

Warum nicht einfach wie andere Befehle eingeben gcc, ls etc ...

89
Renjith G

Unter Linux, UNIX und verwandten Betriebssystemen bezeichnet . Das aktuelle Verzeichnis. Da Sie eine Datei in Ihrem aktuellen Verzeichnis ausführen möchten und dieses Verzeichnis nicht in Ihrem $PATH Befindet, benötigen Sie das Bit ./, Um der Shell mitzuteilen, wo sich die ausführbare Datei befindet. ./foo Bedeutet also, die ausführbare Datei mit dem Namen foo auszuführen, die sich in diesem Verzeichnis befindet.

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

80
badp

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

Aber warum? Kurz gesagt, es dient der Sicherheit. Wenn Sie im Home-Verzeichnis einer anderen Person (oder/tmp) suchen und nur gcc oder ls eingeben, möchten Sie wissen, dass Sie die echte Version ausführen, keine bösartige Version Ihrer Prankster Freund hat geschrieben, die alle Ihre Dateien löscht. Ein anderes Beispiel wäre test oder [, Die diese Befehle in Shell-Skripten möglicherweise überschreiben, wenn Ihre Shell diese nicht als integrierte Funktionen hat.

. Als letzten Eintrag in Ihrem Pfad zu haben, ist ein bisschen sicherer, aber es gibt andere Angriffe, die davon Gebrauch machen. Eine einfache Möglichkeit besteht darin, gängige Tippfehler wie sl oder ls-l Auszunutzen. Oder suchen Sie einen allgemeinen Befehl, der zufällig nicht auf diesem System installiert ist - vim, da Sysadmins mit überdurchschnittlicher Wahrscheinlichkeit diesen Befehl eingeben.

103
mattdm

Wenn Sie meinen, warum brauchen Sie zu Beginn ./ - das liegt daran, dass das aktuelle Verzeichnis (anders als in Windows) standardmäßig nicht Teil Ihres Pfads ist. Wenn du läufst:

$ ls

ihre Shell sucht in den Verzeichnissen Ihrer PATH-Umgebungsvariablen nach ls (echo $PATH, um es zu sehen) und führt die erste ausführbare Datei mit dem Namen ls aus, die gefunden wird. Wenn Sie Folgendes eingeben:

$ a.out

die Shell wird dies ebenfalls tun - aber sie wird wahrscheinlich keine ausführbare Datei namens a.out finden. 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
45
Simon Whitaker

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

Versuchen Sie ALT + F2 und geben Sie Folgendes ein: gksudo gedit /etc/environment, Wenn 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 schlecht, schlecht, schlecht und schlecht.

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

. Ist das aktuelle Verzeichnis

.something Wäre eine versteckte Datei (Geben Sie "ALT +" ein, damit sie in Nautilus angezeigt werden, oder versuchen Sie "ls -la".

./someProgram.sh Geben Sie 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.

4
tiktak

Die vollständigere Regel lautet tatsächlich: Wenn sich ein Schrägstrich / Im Pfad befindet, suchen Sie nicht nach PATH

Bevor wir auf die Gründe eingehen, sollten Sie zunächst Folgendes wissen: Führen Sie eine der folgenden Methoden aus:

bin/someprog

oder:

/bin/someprog

oder:

cd bin
./myexec

führen Sie bin/someprog aus, ohne die Variable PATH aus genau demselben Grund zu durchsuchen: Alle bin/someprog, /bin/someprog und ./someprog haben einen Schrägstrich / In ihnen.

someprog allein hat keinen Schrägstrich / und sucht daher nur in PATH.

POSIX 7 spezifiziert diese Regel unter: http: //pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01

Begründung für die / POSIX PATH-Regel

Angenommen, das läuft:

someprog

würde suchen:

  • relativ zu CWD zuerst
  • relativ zu PATH nach

Wenn Sie dann /bin/someprog Von Ihrer Distribution aus ausführen möchten, haben Sie Folgendes getan:

someprog

es würde manchmal funktionieren, aber andere würden fehlschlagen, weil Sie sich möglicherweise in einem Verzeichnis befinden, das ein anderes nicht verwandtes someprog -Programm enthält.

Daher würden Sie bald feststellen, dass dies nicht zuverlässig ist, und Sie würden am Ende immer absolute Pfade verwenden, wenn Sie PATH verwenden möchten, wodurch der Zweck von PATH zunichte gemacht wird.

Dies ist auch der Grund, warum es eine wirklich schlechte Idee ist, relative Pfade in Ihrem Pfad zu haben. Ich bin sehe dich an, node_modules/bin .

Nehmen wir umgekehrt an, dass Laufen:

./someprog

Würde suchen:

  • relativ zu PATH zuerst
  • relativ zu CWD nach

Wenn Sie dann gerade ein Skript someprog aus einem Git-Repository heruntergeladen haben und es von CWD ausführen möchten, wären Sie sich nie sicher, ob dies das eigentliche Programm ist, das ausgeführt wird, da Ihre Distribution möglicherweise Folgendes hat:

/bin/someprog

das ist in dir PATH von einem Paket, das du installiert hast, nachdem du letztes Jahr nach Weihnachten zu viel getrunken hast.

Daher wären Sie erneut gezwungen, immer lokale Skripte relativ zu CWD mit vollständigen Pfaden auszuführen, um zu wissen, was Sie ausführen:

"$(pwd)/someprog"

das wäre auch extrem nervig.

Eine andere Regel, die Sie möglicherweise in Versuchung führen könnten, wäre:

relative Pfade verwenden nur PATH, absolute Pfade nur CWD

dies zwingt die Benutzer jedoch erneut dazu, für Nicht-PATH-Skripte mit "$(pwd)/someprog" immer absolute Pfade zu verwenden.

Die Pfadsuchregel / Bietet eine einfach zu merkende Lösung für das About-Problem:

  • schrägstrich: Verwenden Sie nicht PATH
  • kein Schrägstrich: Verwenden Sie nur PATH

dies macht es sehr einfach, immer zu wissen, was Sie ausführen, indem Sie sich auf die Tatsache verlassen, dass Dateien im aktuellen Verzeichnis entweder als ./somefile oder somefile ausgedrückt werden können, und gibt daher eine besondere Bedeutung einer von ihnen.

Manchmal ist es etwas ärgerlich, dass Sie relativ zu PATH nicht nach some/prog Suchen können, aber ich sehe keine vernünftigere Lösung dafür.