Unter Linux wird jede einzelne Entität als DATEI betrachtet. Wenn ich vim <cd-Name>
mache dann vim
öffnet den Inhalt des Verzeichnisses in seinem Editor, da es nicht zwischen Datei und Verzeichnis unterscheidet.
Aber heute bin ich bei der Arbeit auf eine Sache gestoßen, auf die ich neugierig bin.
Ich hatte vor, eine Datei aus einem verschachtelten Verzeichnis zu öffnen
vim a/b/c/d/file
Aber statt vim
, habe ich eingegeben
cd a/b/c/d/
und drücken Sie die TAB zweimal, aber der Befehl zeigte nur das verfügbare Verzeichnis des „d“-Verzeichnisses und keine Dateien.
Nicht die cd
Befehl honor „alles ist eine Datei „? Oder übersehe ich etwas?
Akzeptierte Antwort:
Die Datei „Alles ist eine Datei “ Phrase definiert die Architektur des Betriebssystems. Das bedeutet, dass alles im System von Prozessen, Dateien, Verzeichnissen, Sockets, Pipes usw. durch einen Dateideskriptor dargestellt wird, der über die virtuelle Dateisystemschicht im Kernel abstrahiert wird. Das virtuelle Dateisystem ist eine vom Kernel bereitgestellte Schnittstelle. Daher wurde der Ausdruck korrigiert, um zu sagen:„Alles ist ein Dateideskriptor “. Linus Torvalds selbst hat es noch einmal etwas genauer korrigiert:„Everything is a stream of bytes “.
Jede „Datei“ hat jedoch auch einen Besitzer und Berechtigungen, die Sie vielleicht von normalen Dateien und Verzeichnissen kennen. Daher können klassische Unix-Tools wie cat, ls, ps, … all diese „Dateien“ abfragen und es ist nicht erforderlich, andere spezielle Mechanismen zu erfinden, als nur die einfachen alten Tools, die alle das read()
verwenden Systemaufruf. Beispielsweise gibt es in der Microsoft OS-Familie mehrere verschiedene read()
Systemaufrufe (ich habe ungefähr 15 gehört) für alle Dateitypen und jeder von ihnen ist ein bisschen anders. Wenn alles eine Datei ist, brauchst du das nicht.
Zu Ihrer Frage :Natürlich gibt es verschiedene Dateitypen . Unter Linux gibt es 7 Dateitypen. Das Verzeichnis ist eines davon. Aber die Dienstprogramme können sie voneinander unterscheiden. Zum Beispiel die komplette Funktion des cd
Befehl (wenn Sie TAB drücken ) listet nur Verzeichnisse auf, da die stat()
Systemaufruf (siehe man 2 stat
) gibt eine Struktur mit einem Feld namens st_mode
zurück . Der POSIX-Standard definiert, was dieses Feld enthalten kann:
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
Die cd
Die Befehlsvervollständigungsfunktion zeigt nur „Dateien“ an, in denen S_ISDIR
Flag ist gesetzt.