Was ist der Unterschied zwischen filename
und ./filename
? Unter welchen Umständen wird einer dem anderen vorgezogen?
Bei Datendateien spielt dies keine Rolle - beide Anweisungen verweisen auf die Datendatei in Ihrem aktuellen Verzeichnis. (Zum Beispiel cat filename
und cat ./filename
sind semantisch identisch.)
Anders sieht es aus, wenn sich der betreffende Dateiname auf eine ausführbare Datei bezieht , dh das erste (oder sogar einzige), was Sie in die Befehlszeile eingeben. ./filename
sucht nach der ausführbaren Datei in Ihrem aktuellen Verzeichnis und nirgendwo anders. filename
Auf der anderen Seite wird die Umgebungsvariable ausgewertet PATH
und filename
in jedem darin gespeicherten Verzeichnis gesucht (das möglicherweise Ihr aktuelles Verzeichnis enthält oder nicht).
./filename
(oder eine andere /path/to/filename
) wird daher bevorzugt, wenn Sie eine bestimmte ausführbare Datei ausführen möchten , nicht die erste, die in Ihrem PATH gefunden wird.
Wenn Sie ein Programm filename
ausführen, müssen Sie das erste in Ihrem $PATH
und das zweite Programm im aktuellen Verzeichnis ausführen.
Wenn Sie diesen Dateinamen als Argument für ein Programm wie in do_something filename
oder verwenden do_something ./filename
, bedeuten sie dasselbe.
Sie beziehen sich auf die Befehlsausführung, richtig?
Es gibt eine Umgebungsvariable PATH
, die einige durch Semikolon getrennte Systemverzeichnisse enthält. Wenn Sie eingeben command
, sucht das System in diesen Verzeichnissen in der angegebenen Reihenfolge, um eine ausführbare Datei mit dem Namen <Befehl> zu finden. Wenn es sie findet, versucht es, sie auszuführen. Sie können Ihren Pfad über echo $PATH
in Bash sehen. Zum Beispiel:
$ echo $ PATH
/ sbin: / bin: / usr / sbin: / usr / bin: / usr / games: / usr / local / sbin: / usr / local / bin: / home / ivanatora / bin: / usr / local / kde4 / bin: / usr / local / kde4 / bin
Bei der Eingabe geben ./filename
Sie den genauen Pfad an: das aktuelle Verzeichnis. Sie können sehen, dass sich das aktuelle Verzeichnis selten in Ihrem $ PATH befindet (aus Sicherheitsgründen). Wenn Sie also eine Datei aus dem aktuellen Verzeichnis ausführen möchten, verwenden Sie ./filename
.
Um eine Datei über ihren Pfad auszuführen (insbesondere wenn sie nicht in $ PATH enthalten ist), können Sie auch Folgendes <path>/file
eingeben:
/ sbin / ifconfig
Ausführbare Sicherheit ist der Hauptgrund für diesen Unterschied.
Du willst nicht . (vorhandenes Arbeitsverzeichnis oder PWD) in Ihrem Pfad, weil jemand eine wichtige ausführbare Datei wie ps oder ls in Ihrem PWD als Trojaner http://en.wikipedia.org/wiki/Trojan_horse_%28computing%29 verwenden und Sie durch die Darstellung fehlerhafter Daten täuschen könnte.
Es hängt davon ab, unter welchen Umständen Sie es verwenden.
Als Argument, zB "Programmdateiname", liegt es dann am Programm, aber im Allgemeinen sind sie identisch.
Als Programmname, z. B. "Dateinamenargumente", durchsuchen "Dateinamenargumente" PATH, um die Binärdatei zu finden, während "./Dateinamenargumente" das Programm im aktuellen Verzeichnis verwenden. Dies ist natürlich nützlich, wenn. ist nicht im PFAD, aber es ist auch nützlich, diesen zu verwenden, selbst wenn. ist im Pfad, vielleicht weil es mit einem früheren Eintrag übereinstimmt.