Warum wird "." Von "ls" angezeigt?

7

Nach dem Lesen der Frage Wenn Sie "ls -a" eingeben, welche Bedeutung hat "." und ".."? Ich habe eine ähnliche.

Warum anzeigen .? Ich meine, gibt es ein Verzeichnis, in dem cd .es nicht funktionieren würde? Wie ist es für einen Benutzer hilfreich, diese Zeile jedes Mal zu sehen?

Arseni Mourzenko
quelle
Nein, dieser Befehl funktioniert immer. Es ist auch interessant zu bemerken, dass cd .. auch immer funktioniert - auch wenn Sie es von /
Dason
3
@Dason Technisch cd .kann dies fehlschlagen, z. B. wenn Sie jetzt keine Berechtigung zum Wechseln in das Verzeichnis haben (dies kann passieren, wenn der Prozess nach dem Ändern seines Arbeitsverzeichnisses zu einem anderen Benutzer geändert wurde oder wenn sich die Berechtigungen für das Verzeichnis geändert haben, nachdem der Prozess sein Verzeichnis geändert hat Verzeichnis).
Gilles 'SO - hör auf böse zu sein'
4
Auch wenn das Verzeichnis von der Festplatte gelöscht wurde; zB mkdir /tmp/foobar; cd /tmp/foobar; rmdir /tmp/foobar; cd .ergibt einen Fehler:...: No such file or directory
Arcege

Antworten:

16

Der Grund für das ls -aAnzeigen .und ..hat nichts mit dem Dienstprogramm und allem, was mit Unix- (und Linux-) Dateisystemen zu tun hat, zu tun.

Alles ist eine Datei.

Verzeichnisse sind wirklich Dateien, die Listen von Dateien enthalten. "Innerhalb" eines bestimmten Verzeichnisses, da dies die Perspektive des Benutzers ist, wenn nicht genau die Perspektive des Dateisystems, gibt es zwei spezielle Dateien.

  • Das erste, aufgerufene ., verweist auf das aktuelle Arbeitsverzeichnis. Dies wird von Menschen fast täglich verwendet, wenn sie beispielsweise einen Befehl im aktuellen Verzeichnis über ausführen ./scriptname.
  • Das zweite aufgerufene ..Verzeichnis verweist auf das übergeordnete CWD-Verzeichnis. Like ., ..wird jeden Tag von jedem verwendet, der Verzeichnisse über in das übergeordnete Verzeichnis ändern möchte cd ...

Der Systemaufruf getdents(), bei dem es sich um das Arbeitspferd auf der Systemseite handelt ls, listet einfach alle Dateien in einem Verzeichnis auf. (Denken Sie daran: Alles ist eine Datei. Geräte, Verzeichnisse, Sockets usw., damit alle angezeigt werden.)

Auf der Utility-Seite haben die Autoren des lsBefehls eine Reihe von Optionen und Kombinationen von Optionen bereitgestellt, mit denen wir bestimmte Informationen oder Arten von Informationen herausfiltern können, z. B. die oben kommentierten @ Gilles, ls -Adie alle anzeigen dotfile, mit Ausnahme von .und ... Alle diese Optionen können als Nachbearbeitungsoptionen betrachtet werden. Sie beeinflussen, was von angezeigt wird ls, nicht was von gefunden wird ls.

Es gibt wirklich keinen Grund, explizit aufzulisten, .und ..standardmäßig, da wir alle wissen, dass sie da sind, wofür sie sind und wann sie verwendet werden sollen.

Es kann auf jeden Fall hilfreich sein, eine Option zu haben, um sie anzuzeigen, wenn Sie Probleme mit seltsamen Berechtigungen beheben.

Überprüfen Sie die Manpage fürgetdents() ¹. Es erklärt etwas mehr über die Funktionsweise und enthält den Quellcode für ein Beispielprogramm, mit dem Sie kompilieren können gcc -Wallund in dem alle Dateien in einem Verzeichnis aufgelistet sind.

-
1. Zumindest getdents()scheint die Ubuntu-Manpage für den Beispielcode zu haben.

Tim Kennedy
quelle
9

lswird normalerweise nicht angezeigt .und ... Versteckt standardmäßig lsalle Dateien, deren Name mit einem .(Punktdateien) beginnt . ls -azeigt sie an, weil Sie aufgefordert haben, alles anzuzeigen. Einige Versionen von lshaben eine etwas andere Option, ls -Aum alle Punktdateien anzuzeigen, aber nicht .oder ...

Das Anzeigen .kann nützlich sein, wenn Sie mehr als die Namen auflisten. Meldet beispielsweise ls -ladie Berechtigungen und den Besitz des aktuellen Verzeichnisses und seines übergeordneten Verzeichnisses zusammen mit denen der Dateien im Verzeichnis.

Gilles 'SO - hör auf böse zu sein'
quelle