
Ich habe in einer Shell herumgespielt und ./ eingegeben. Ich erhalte die folgende Ausgabe:
bash: ./: Is a directory
Es sieht so aus, als ob „./“ prüft, ob ein Verzeichnis mit dem angegebenen Namen existiert. Ich habe versucht, Dokumentation dazu zu finden, um zu sehen, ob ich das richtig verstanden habe, aber ich kann online nichts finden. Kann mir das jemand erklären?
Antwort1
Eine allgemeine Definition hierfür ist wahrscheinlich nicht im Bash-Handbuch zu finden, aberdie POSIX-Spezifikation(Abschnitt Pfadnamenauflösung):
Der spezielle Dateinamenpunkt soll auf das durch seinen Vorgänger angegebene Verzeichnis verweisen.
Nun, was ist der Vorgänger, wenn wir nur haben .
? Ich habe den wichtigen Teil hervorgehoben:
Wenn der Pfadname nicht mit einem Schrägstrich beginnt, wird der Vorgänger des ersten Dateinamens des Pfadnamens alsdas aktuelle Arbeitsverzeichnisdes Prozesses
Auch,
Ein Pfadname, der mindestens ein Zeichen außer einem Schrägstrich enthält und mit einem oder mehreren abschließenden Schrägstrichen endet, wird so aufgelöst, als ob ein einzelner Punkt ( '.' ) an den Pfadnamen angehängt wäre.
Wenn Sie also eingeben, ./
wird es als aufgelöst ./.
, was im Grunde auf Ihr aktuelles Arbeitsverzeichnis verweist. Wenn Sie etwas in Ihre Shell eingeben und drücken Enter, versucht die Shell, den ersten Teil als Befehl auszuführen. (Im Grunde die erste Gruppe von Zeichen bis zum ersten Leerzeichen.)
Es gibt keinen Befehl oder keine ausführbare Datei mit dem Namen ./.
, daher schlägt die Aktion fehl und Sie erhalten die Meldung ./
„ist ein Verzeichnis“. Interessanterweise.
Istein Befehl (es ist ein integriertes Element, das auch als zu finden ist source
), wenn Sie also einfach Folgendes eingeben, .
erhalten Sie: bash: .: filename argument required
.
Antwort2
Wie andere bereits geschrieben haben, ./
ist dies der Name des aktuellen Verzeichnisses. Als Sie ./
in die Bash-Eingabeaufforderung eingegeben und die Eingabetaste gedrückt haben, haben Sie versucht, das aktuelle Verzeichnis als Befehl auszuführen, was natürlich fehlschlug, und Bash hat Ihnen die Meldung (sinngemäß) angezeigt: „Das kann ich nicht. ./
ist ein Verzeichnis und ich kann Verzeichnisse nicht als Befehle ausführen.“
Antwort3
Dies .
impliziert das aktuelle Verzeichnis. Sie verwenden es ./
als Präfix für alle Dateien im aktuellen Verzeichnis.
Ähnlich ..
verhält es sich mit dem vorherigen (höheren) Verzeichnis. Es wird oft verwendet, wenn man in ein Verzeichnis auf höherer Ebene wechselt, z. B.cd ../../../
Gegeben sei ein Dateisystem mit dem Inhalt:
# Comments start with a hash and aren't parsed
/ # root directory
/foo/ # first level directory
/foo/bar/ # second level directory
/foo/bar/baz # third level directory
/foo/bar/baz/qux # a file in the third level directory
Wenn Sie sich im Director der dritten Ebene (baz) befinden und ausführen ls
, sehen Sie qux
. Wenn Sie ausführen ls .
, erhalten Sie dieselbe Ausgabe, als wenn Sie ausführen ls ./
.
ls ..
Wenn Sie sich im Verzeichnis der dritten Ebene (baz) befinden und beide ausführen, ls ../
erhalten Sie baz
. Das heißt, den Inhalt des Verzeichnisses eine Ebene höher.
Antwort4
Unter Linux bedeutet ./ das aktuelle Verzeichnis (und ../ bezieht sich auf das übergeordnete Verzeichnis).
Wenn Sie „ls -a“ ausführen, werden . und .. als Verzeichnisse aufgelistet (Sie benötigen „-a“, da . ein verstecktes Verzeichnis darstellt).