Warum brauchen Sie ./ (dot-slash) vor der ausführbaren Datei oder dem Skriptnamen, um es in bash auszuführen?
Beim ausführen von scripts in der bash, habe ich zu schreiben ./
am Anfang:
$ ./manage.py syncdb
Wenn ich das nicht Tue, bekomme ich eine Fehlermeldung:
$ manage.py syncdb
-bash: manage.py: command not found
Was ist der Grund dafür? Ich dachte .
ist ein alias für den aktuellen Ordner, und daher diese beiden Aufrufe werden sollte, entspricht.
Ich versteh auch nicht, warum ich nicht brauchen ./
beim ausführen von Anwendungen, wie:
user:/home/user$ cd /usr/bin
user:/usr/bin$ git
(läuft ohne ./
)
InformationsquelleAutor der Frage Dan Abramov | 2011-06-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil auf Unix, in der Regel, das aktuelle Verzeichnis nicht in
$PATH
.Wenn Sie geben Sie einen Befehl, den die shell sucht eine Liste von Verzeichnissen, wie angegeben durch die
PATH
variable. Das aktuelle Verzeichnis nicht in dieser Liste.Den Grund für die nicht das aktuelle Verzeichnis auf dieser Liste ist Sicherheit.
Sagen wir, du bist root und wechseln in das Verzeichnis eines anderen Benutzers und Typ
sl
stattls
. Wenn das aktuelle Verzeichnis ist inPATH
wird, wird die shell versuchen, führen Sie diesl
- Programm in das Verzeichnis (da es keine anderesl
Programm). Dasssl
- Programm kann schädlich sein.Funktioniert es mit
./
weil POSIX spezifiziert ein name für den Befehl enthalten/
wird verwendet als Dateinamen direkt, unterdrücken eine Suche in$PATH
. Sie hätte volle Pfad für den genau gleichen Effekt, aber./
ist kürzer und einfacher zu schreiben.BEARBEITEN
Dass
sl
Teil war nur ein Beispiel. Die Verzeichnisse inPATH
sind sequentiell durchsucht und bei übereinstimmung wird das Programm ausgeführt. Also, je nachdem, wiePATH
sieht, der Eingabe einer normalen Befehl möglicherweise oder möglicherweise nicht genug, um führen Sie das Programm in das aktuelle Verzeichnis.InformationsquelleAutor der Antwort cnicutar
Als bash interpretiert die Kommandozeile, sieht es für Befehle an Standorten beschrieben, die in der environment-variable
$PATH
. Um es zu sehen geben:Haben Sie einige Pfade durch Doppelpunkte voneinander getrennt. Wie sehen Sie den aktuellen Pfad
.
ist in der Regel nicht in$PATH
. Also Bash nicht finden können, Ihre Befehl, wenn es in das aktuelle Verzeichnis. Sie können es ändern, indem er:Diese Zeile fügt das aktuelle Verzeichnis in
$PATH
so können Sie tun:Ist es nicht empfohlen, da es die Sicherheit Problem, plus können Sie haben seltsame Verhaltensweisen, wie
.
variiert je nach der Verzeichnis Sie befinden sich in 🙂Vermeiden:
Als Sie können "Maske" einige standard-Befehl, und öffnen Sie die Tür zu Sicherheitsverletzung 🙂
Nur meine zwei Cent.
InformationsquelleAutor der Antwort neuro
Ihr Skript, wenn Sie in Ihrem home-Verzeichnis wird nicht gefunden werden, wenn die shell sucht in den
$PATH
Umgebungsvariable zu finden, die Ihrem Skript.Den
./
sagt: "schauen Sie in das aktuelle Verzeichnis für mein Skript eher als die Suche auf alle Verzeichnisse angegeben, in$PATH
'.InformationsquelleAutor der Antwort mdm
Wenn du den '.' Sie sind im wesentlichen der "vollständigen Pfad", um die ausführbare bash-Skript, damit Ihre Schale nicht brauchen, um überprüfen Sie Ihre PATH-variable. Ohne den '.' Ihre Hülle Aussehen wird, in Ihrer PATH-Variablen (die man sehen kann, läuft
echo $PATH
um zu sehen, ob der Befehl, den Sie eingegeben haben, lebt in einem beliebigen Ordner auf Ihrem WEG. Wenn es nicht (wie ist der Fall mit manage.py) es sagt, es kann nicht die Datei finden. Es gilt als schlechte Praxis umfassen das aktuelle Verzeichnis auf Ihrem PFAD, der erklärt Recht gut hier: http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.htmlInformationsquelleAutor der Antwort Mark Drago
Auf *nix, im Gegensatz zu Windows, das aktuelle Verzeichnis ist in der Regel nicht in Ihrem
$PATH
variable. Also das aktuelle Verzeichnis nicht durchsucht, wenn die Ausführung von Befehlen. Sie brauchen nicht./
für die Ausführung von Anwendungen, da diese Anwendungen sind in Ihrem $PATH; wahrscheinlich sind Sie in/bin
oder/usr/bin
.InformationsquelleAutor der Antwort Anomie
Diese Frage hat schon einige tolle Antworten, aber ich wollte noch hinzufügen, dass, wenn die ausführbare Datei ist auf dem WEG, und Sie bekommen sehr unterschiedliche Ausgänge, wenn Sie Sie ausführen
diejenigen, die Sie erhalten, wenn Sie Sie ausführen
(sagen wir, Sie laufen in Fehlermeldungen mit der einen und nicht der anderen), dann könnte das problem sein, dass du zwei verschiedene Versionen der ausführbaren Datei auf Ihrem Computer: eine auf dem Weg, und die anderen nicht.
Überprüfen Sie dies, indem Sie
die ausführbare
und
Behoben meine Probleme...ich hatte drei Versionen der ausführbaren Datei, von denen nur eines kompiliert wurde korrekt für die Umwelt.
InformationsquelleAutor der Antwort KR_Henninger
Wenn das Skript nicht im Pfad sein, dies zu tun. Für weitere Informationen Lesen Sie http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html
InformationsquelleAutor der Antwort Gayan Hewa
Es ist der Unterschied zwischen
Current Directory
undWorking Directory
vielleicht finden Sie es aufgoogle
leicht. Das ist der Grund, Ihremanage.py syncdb
din nicht wie erwartet ausgeführt.Aktuellen Verzeichnis : Es ist das Verzeichnis aus, wo deine shell oder übergeordneten Prozess ausgeführt wird.
In UNIX-basierten system, wenn Sie haben Ihre Datei an
/data/myfile.out
dann sind Sie durchqueren, um Ihre Datei durch Namen von Komponenten, die getrennt sind durchforward slash "/"
also, wenn"."
ist das aktuelle Verzeichnis dann, wenn Sie wollen, um den Zugriff(execute-in Ihrem Fall) - Datei in Ihrem aktuellen Verzeichnis, die Sie zu sagen haben./myexecutableFile.o
. Wenn Sie die ausführbare Datei in einem anderen Ordner von Ihrem aktuellen Verzeichnis, dann würden Sie so etwas tun./myFiles/myexecutableFile.o
. Hoffe, du hast das, was ich versuche zu erklären.InformationsquelleAutor der Antwort Amandeep Jiddewar