GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum wird das Root-Verzeichnis durch ein /-Zeichen gekennzeichnet?

Der Schrägstrich / ist das Trennzeichen, das Verzeichnisse in Pfaden in Unix-ähnlichen Betriebssystemen trennt. Dieses Zeichen scheint irgendwann in den 1970er Jahren gewählt worden zu sein, und nach anekdotischen Quellen könnten die Gründe damit zusammenhängen, dass der Vorgänger von Unix, das Multics-Betriebssystem, den > verwendete Zeichen als Pfadtrennzeichen, aber die Designer von Unix hatten bereits die Zeichen > reserviert und < um E/A-Umleitung auf der Shell-Befehlszeile anzuzeigen, lange bevor sie ein mehrstufiges Dateisystem hatten. Als es also an der Zeit war, das Dateisystem zu entwerfen, mussten sie ein anderes Zeichen finden, um die Trennung der Pfadnamenelemente anzuzeigen.

Zu beachten ist hier das in den 1970er Jahren gebräuchliche Terminal Lear-Siegler ADM-3A, woraus unter anderem die Praxis der Verwendung des ~ hervorgeht Zeichen zur Darstellung des Heimatverzeichnisses stammt, das / Der Schlüssel befindet sich neben > Schlüssel:

Warum das Root-Verzeichnis durch einen einzelnen / gekennzeichnet ist , ist es eine Konvention, die höchstwahrscheinlich von der Tatsache beeinflusst wird, dass das Stammverzeichnis das Verzeichnis der obersten Ebene der Verzeichnishierarchie ist, und obwohl andere Verzeichnisse darunter liegen können, gibt es normalerweise keinen Grund, auf etwas außerhalb des Stammverzeichnisses zu verweisen . Ebenso hat der Verzeichniseintrag selbst keinen Namen, da er die Grenze des sichtbaren Verzeichnisbaums darstellt.


Das erste hierarchische Dateisystem, wie wir es heute kennen, wurde für Multics entworfen. Das Design wird in „A General-Purpose File System For Secondary Storage“ von R.C. Daley und P.G. Neumann. Ein hervorstechendes Merkmal dieses Dateisystems ist, dass ein Verzeichnis eine Datei ist, die wie jede andere Datei in einem Verzeichnis enthalten sein kann. Die Dateistruktur bildet einen Baum, in dem alle Nichtblattknoten Verzeichnisse sind. Die Wurzel des Baums ist immer ein Verzeichnis. Jede Datei hat einen Namen (den Eintragsnamen), der innerhalb ihres übergeordneten Verzeichnisses eindeutig ist. Das Stammverzeichnis hat keinen Namen, da es nicht in einem anderen Verzeichnis enthalten ist.

Um eine Datei zu benennen, müssen Sie den Pfad von der Wurzel des Baums beschreiben. Multics hat eine natürliche Syntax für Pfadnamen angenommen, wobei if P ist der Pfad zu einem Verzeichnis und F der Name einer Datei ist, dann P>F ist die Syntax für die Datei namens F innerhalb des Verzeichnisses, dessen Pfad P ist .

Für die Zeiten, in denen Sie sich nicht mit Verzeichnissen belasten möchten, hatte Multics eine Vorstellung von Arbeitsverzeichnissen. Ein bloßer Dateiname ohne Verzeichnisangabe wird als Datei im Arbeitsverzeichnis interpretiert.

Kombinieren Sie diese Regeln, foo ist eine Datei im Arbeitsverzeichnis; foo>bar ist eine Datei im untergeordneten Verzeichnis foo des Arbeitsverzeichnisses usw. Diese Regeln beschreiben relative Pfade, aber es wird eine zusätzliche Regel benötigt, um absolute Pfade ausgehend vom Stammverzeichnis zu erstellen. Da das Lesen eines Pfadnamens von links nach rechts dem Bewegen von der Wurzel zu den Blättern des Baums entspricht, sollte die Wurzel durch eine spezielle Markierung links vom Pfadnamen angezeigt werden. Da Dateinamen niemals leer sind (weil das oft verwirrend wäre), beginnt kein relativer Pfadname jemals mit dem Zeichen > , was es zu einer praktischen Markierung für absolute Pfadnamen macht. Also >foo ist die Datei namens foo im Stammverzeichnis >foo>bar ist die Datei namens bar im Verzeichnis namens foo im Stammverzeichnis usw. Dadurch bleibt das Stammverzeichnis übrig, das die leere Zeichenfolge sein könnte; es ist jedoch oft nicht bequem, die leere Zeichenkette als Pfadnamen zu verwenden, also wird sie stattdessen > geschrieben , was den zusätzlichen Vorteil hat, dass ein Pfadname genau dann absolut ist, wenn sein erstes Zeichen > ist .

Unix hat dieses Design von Multics übernommen. Da Unix bereits das Zeichen > verwendet hatte für die Ausgabeumleitung in seiner Befehls-Shell wählten seine Designer ein anderes Zeichen / Verzeichnisse in Pfadnamen zu trennen.


In Pfadnamenkomponenten unter Unix dürfen nur zwei Zeichen nicht verwendet werden:das Nullzeichen, das Strings in C (der Sprache des Kernels) abschließt, und der Schrägstrich, der als Pfadtrenner reserviert ist. Außerdem dürfen Pfadkomponenten keine leeren Zeichenfolgen sein.

In einem Pfadnamen haben wir also nur zwei Arten von Token:einen Schrägstrich und eine Komponente.

Angenommen, ohne neue Token hinzuzufügen möchten wir zwei Arten von Pfaden unterstützen, relative und absolute. Außerdem möchten wir in der Lage sein, auf das Root-Verzeichnis zu verweisen, das keinen Namen hat (es hat kein übergeordnetes Verzeichnis, das ihm einen Namen geben würde).

Wie können wir relative Pfade und absolute Pfade darstellen und auf das Stammverzeichnis verweisen, indem wir nur den Schrägstrich verwenden?

Der naheliegendste Weg, eine Sprache zu erweitern (abgesehen von der Einführung eines neuen Tokens), besteht darin, eine neue Syntax zu erstellen:Kombinationen von Tokens mit ungültiger Syntax eine neue Bedeutung zu geben.

Pfade, die mit einem Schrägstrich beginnen, sind nicht sinnvoll, warum also nicht einen vorangestellten Schrägstrich als Markierung verwenden, der anzeigt, dass "dieser Pfad absolut und nicht relativ ist".

Ein Pfad, der nur einen Schrägstrich enthält, ist ebenfalls ungültig, warum also nicht die Bedeutung "das Stammverzeichnis" zuweisen?

Diese beiden Bedeutungen sind miteinander verbunden, da ein absoluter Pfad mit der Suche im Stammverzeichnis beginnt. Mit anderen Worten, ein führender Schrägstrich hat die Bedeutung:

  • navigiere zum Root-Verzeichnis und verwende den Schrägstrich.
  • wenn es mehr Material im Pfad gibt, dann verarbeite es als relativen Pfad, sonst bist du fertig.

Dann könnten wir genauso gut einen abschließenden Schrägstrich einfügen, was bedeuten kann, dass „dieser Pfad behauptet, dass die letzte Pfadkomponente der Name eines Verzeichnisses und nicht einer regulären Datei oder eines anderen Objekttyps ist:Dieser abschließende Schrägstrich bezeichnet dieses Verzeichnis ähnlich wie so wie der führende Schrägstrich das Stammverzeichnis bezeichnet."

Mit all dieser obigen Syntax haben wir immer noch eine Syntax mit einer nicht zugewiesenen Bedeutung:doppelte Schrägstriche, dreifache Schrägstriche und so weiter.

Warum nicht einfach ein anderes Token einführen und es anders machen. Das liegt wohl daran, dass die Designer generell minimalistische Ansätze verfolgten. (Warum funktioniert der ed Editor zeigt nur ein ? an wenn Sie etwas falsch machen?) Der Schrägstrich ist einfach zu tippen und erfordert keine Verschiebung. Eine Pfadsprache mit nur zwei Token-Typen (Komponente und Schrägstrich) ist leicht zu merken und zu verwenden.

Eine weitere wichtige Überlegung ist, dass einfache Manipulationen von Pfaden möglich sind, indem nur Zeichenfolgendarstellungen verwendet werden. Zum Beispiel können wir ganz einfach absolute Pfade zu einem neuen übergeordneten Verzeichnis „re-rooten“:

OLD_PATH=/old/path
NEW_HOME=/new/home

NEW_PATH="$NEW_HOME$OLD_PATH"  /new/home/old/path

Dies würde nicht funktionieren, wenn wir auf andere Weise absolute Pfade angeben würden, wie z. B. ein vorangestelltes Dollarzeichen oder was auch immer:

OLD_PATH=^old/path  # ^ means absolute path
NEW_HOME=^new/home

# now we need more string kung-fu than just catenation
NEW_PATH="$NEW_HOME/${OLD_PATH#^}"

Diese Art der Codierung wird in einigen Fällen immer noch benötigt, wenn es um Pfade im Unix-Stil geht, aber es gibt weniger davon.


Linux
  1. Warum kann Rm schreibgeschützte Dateien entfernen?

  2. Warum erkennt das Bash-Skript keine Aliase?

  3. Linux – Ist der Schrägstrich (/) Teil des Namens des Linux-Root-Verzeichnisses?

  4. Verstehen des Verzeichnisses /etc/skel unter Linux

  5. Core-Dump, aber Core-Datei befindet sich nicht im aktuellen Verzeichnis?

Linux – Warum wird das Root-Verzeichnis mit einem / -Zeichen gekennzeichnet?

Verstehen des Verzeichnisses /etc/sysconfig

Wie finde ich den Besitzer einer Datei oder eines Verzeichnisses in Python?

Die Verwendung von chown zum Ändern des Gruppeneigentümers eines Verzeichnisses ist nicht erlaubt....Warum?

Warum unterscheidet sich das „sudo“-Passwort vom „su root“-Passwort?

Warum kann ich diese Datei nicht als root löschen?