Warum ist das Stammverzeichnis mit einem / -Zeichen gekennzeichnet?

95

Ich habe diesbezüglich bei Google nachgeforscht, aber die Ergebnisse waren trübe. Warum /kennzeichnet das Zeichen das Stammverzeichnis? Gibt es feste Gründe dafür?

Ruban Savvy
quelle
12
Der Grund dafür ist, dass '/' das Verzeichnistrennzeichen ist und das Stammverzeichnis selbst namenlos ist, genauso wie cd /homedas cd /home/Anhängen /am Ende eines leeren Namens den Zugriff auf dieses Verzeichnis ermöglicht.
SF.
2
Haben Sie folgendes gelesen: en.wikipedia.org/wiki/Root_directory ?
Kevdog777
11
Es ist namenlos, denn von innen betrachtet ist es die Grenze des sichtbaren Verzeichnisbaums. Die sichtbare Verzeichnishierarchie kann lediglich ein Teilbaum in einer größeren Hierarchie sein, z. B. wenn die Pfadnamensuche über einen chroot()Aufruf geändert wurde. Von innen betrachtet wird dies jedoch abstrahiert.
Thomas Nyman
14
Weil die leere Saite eine schreckliche Wahl gewesen wäre!
Bakuriu
3
Zusätzlich zu dem, was erwähnt wird, führt die Verwendung von / zur Angabe der Wurzel zu bestimmten Nebenwirkungen in Bezug auf absolute und relative Pfadnamen. /some/dirIMMER bedeutet, dass (root)/some/dirwhile some/dirimmer relativ zum aktuellen Arbeitsverzeichnis ist. Dieses Prinzip ist auch auf die Verwendung von Web-URLs übertragbar.
Tor Valamo

Antworten:

108

Der Schrägstrich /ist das Trennzeichen, das Verzeichnisse in Pfaden in Unix-ähnlichen Betriebssystemen trennt . Dieses Zeichen scheint irgendwann in den 1970er Jahren ausgewählt worden zu sein, und laut anekdotischen Quellen könnten die Gründe damit zusammenhängen, dass der Vorgänger von Unix, das Betriebssystem Multics , das >Zeichen als Pfadtrennzeichen verwendete, die Designer von Unix jedoch bereits reserviert hatten die Zeichen >und <um die E / A-Umleitung in der Shell-Befehlszeile zu kennzeichnen, 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 zu kennzeichnen.

Hierbei ist zu beachten, dass im Lear-Siegler ADM-3A-Terminal, das in den 1970er Jahren häufig verwendet wurde und aus dem unter anderem die Praxis der Verwendung des ~Zeichens zur Darstellung des Basisverzeichnisses stammt , der /Schlüssel neben dem >Schlüssel steht:

Tastaturbelegung des Lear-Siegler ADM-3A-Terminals

Was den Grund für die Bezeichnung des Stammverzeichnisses durch ein einzelnes Verzeichnis anbelangt /, so ist dies wahrscheinlich darauf zurückzuführen, dass das Stammverzeichnis das oberste Verzeichnis der Verzeichnishierarchie ist. Andere Verzeichnisse befinden sich möglicherweise darunter, in der Regel jedoch nicht. Ein Grund, auf etwas außerhalb des Stammverzeichnisses zu verweisen. Ebenso hat der Verzeichniseintrag selbst keinen Namen, da er die Grenze des sichtbaren Verzeichnisbaums darstellt.

Thomas Nyman
quelle
2
"Während andere Verzeichnisse darunter sein können, gibt es normalerweise keinen Grund, auf etwas außerhalb des Stammverzeichnisses zu verweisen." Ich verstehe das nicht. Ich bin nicht sicher, in welche Richtung Sie mit "unter" meinen, aber es gibt nichts "außerhalb" der Hierarchie /. Unix-Dateisysteme sind ein einzelner Baum mit Einhängepunkten für die verschiedenen Laufwerke.
Alexis
4
Es gibt auch chrootund so - Sie können auf nichts außerhalb der neuen Wurzel zugreifen , aber das bedeutet nicht, dass sie nicht da sind.
Bobson
1
@ Gilles, der physische Standort des Laufwerks ist nicht die Frage. Jede Festplattenpartition befindet sich in diesem Sinne außerhalb der Root-Partition, wird jedoch in der Dateisystemhierarchie unter root eingebunden. Bobson, ein guter Punkt zu Chroot, aber er passt nicht zu dem, was Thomas gesagt hat: Nach Chroot ist es nicht so, dass "es normalerweise keinen Grund gibt", außerhalb der Systemwurzel zu gehen. es ist unmöglich. Unter Unix befindet sich alles im Dateisystem unter root.
Alexis
1
"Nach chroot ist es nicht so, dass" es normalerweise keinen Grund gibt, "außerhalb der Systemwurzel zu gehen; es ist unmöglich." Das ist schlicht falsch. Zu der Zeit, chroot()als es eingeführt wurde, hatte es überhaupt keine gefängnisähnlichen Eigenschaften , es wirkte sich lediglich auf die Auflösung von Pfadnamen aus. Auch heute privilegierte Prozesse können von einem chroot ausbrechen durch Design . Ich habe es auch chroot()in einem früheren Kommentar erwähnt .
Thomas Nyman
4
IIRC, die Multics-Konvention, wurde nicht nur >als Verzeichnis-Trennzeichen verwendet, sondern auch <, um auf das übergeordnete Verzeichnis zu verweisen: <an sich war sie gleichbedeutend mit .., während sie <foogleichbedeutend mit war ../foo. Das fand ich immer ästhetisch ansprechend.
Mark Reed
55

Das erste hierarchische Dateisystem, wie wir es heute kennen, wurde für Multics entwickelt . Das Design wird in „Ein universelles Dateisystem für die sekundäre Speicherung“ von RC Daley und PG Neumann beschrieben. 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 Nicht-Blattknoten Verzeichnisse sind. Die Wurzel des Baumes ist immer ein Verzeichnis. Jede Datei hat einen Namen (den Eintragsnamen ), der innerhalb des übergeordneten Verzeichnisses eindeutig ist. Das Stammverzeichnis hat keinen Namen, da es nicht in einem anderen Verzeichnis enthalten ist.

Um eine Datei zu bestimmen, müssen Sie den Pfad vom Stamm des Baums beschreiben. Multics verwendete eine natürliche Syntax für Pfadnamen, wobei wenn Pder Pfad zu einem Verzeichnis und Fder Name einer Datei ist, dann ist dies die Syntax für die Datei, die in dem Verzeichnis aufgerufen wird, dessen Pfad ist .P>FFP

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

Wenn Sie diese Regeln kombinieren, foobefindet sich eine Datei im Arbeitsverzeichnis. foo>barist eine Datei im untergeordneten Verzeichnis foodes Arbeitsverzeichnisses und so weiter. Diese Regeln beschreiben relative Pfade, es ist jedoch eine zusätzliche Regel erforderlich, um absolute Pfade ausgehend vom Stammverzeichnis zu erstellen. Da das Lesen eines Pfadnamens von links nach rechts der Bewegung von der Wurzel zu den Blättern des Baums entspricht, sollte die Wurzel durch einen speziellen Marker links vom Pfadnamen gekennzeichnet werden. Da Dateinamen niemals leer sind (da dies oft verwirrend wäre), beginnt kein relativer Pfadname mit dem Zeichen >, was es zu einer praktischen Markierung für absolute Pfadnamen macht. Ist >fooalso die Datei fooim Stammverzeichnis aufgerufen , >foo>barwird die Datei barim Verzeichnis aufgerufenfooim Stammverzeichnis usw. Dadurch bleibt das Stammverzeichnis erhalten, bei dem es sich möglicherweise um eine leere Zeichenfolge handelt. Oft ist es jedoch nicht bequem, die leere Zeichenfolge als Pfadnamen zu verwenden. Stattdessen wird sie geschrieben. >Dies hat den zusätzlichen Vorteil, dass ein Pfadname genau dann absolut ist, wenn er das erste Zeichen enthält >.

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

Gilles
quelle
11

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

In einem Pfadnamen gibt es 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 Stammverzeichnis 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?

Die naheliegendste Möglichkeit, eine Sprache zu erweitern (mit Ausnahme der Einführung eines neuen Tokens), besteht darin, eine neue Syntax zu erstellen: Geben Sie Kombinationen von Tokens mit ungültiger Syntax eine neue Bedeutung.

Pfade, die mit einem Schrägstrich beginnen, sind nicht sinnvoll. Verwenden Sie daher einen führenden Schrägstrich als Markierung, die angibt, dass dieser Pfad absolut und nicht relativ ist.

Ein Pfad, der nur einen Schrägstrich enthält, ist ebenfalls ungültig. Weisen Sie ihm also die Bedeutung "das Stammverzeichnis" zu.

Diese beiden Bedeutungen hängen zusammen, weil ein absoluter Pfad im Stammverzeichnis sucht. Mit anderen Worten, ein führender Schrägstrich hat die Bedeutung:

  • Navigieren Sie zum Stammverzeichnis und verwenden Sie den Schrägstrich.
  • Wenn der Pfad mehr Material enthält, verarbeiten Sie es als relativen Pfad. Andernfalls sind Sie fertig.

Dann könnten wir genauso gut einen abschließenden Schrägstrich einfügen, was bedeuten kann, dass dieser Pfad besagt, dass die letzte Pfadkomponente der Name eines Verzeichnisses ist und keine reguläre Datei oder ein anderes Objekt. Dieser abschließende Schrägstrich bezeichnet dieses Verzeichnis ähnlich wie der führende Schrägstrich bezeichnet das Stammverzeichnis. "

Bei 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? Dies liegt wahrscheinlich daran, dass die Designer im Allgemeinen minimalistische Ansätze gewählt haben. (Warum zeigt der edEditor nur ein an, ?wenn Sie etwas falsch machen?) Der Schrägstrich ist einfach einzugeben und erfordert keine Verschiebung. Eine Pfadsprache mit nur zwei Tokentypen (Komponente und Schrägstrich) ist leicht zu merken und zu verwenden.

Ein weiterer wichtiger Gesichtspunkt ist, dass einfache Manipulationen von Pfaden nur mit Zeichenfolgendarstellungen möglich sind. Zum Beispiel können wir die absoluten Pfade zu einem neuen übergeordneten Verzeichnis ganz einfach "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 absolute Pfade auf eine andere Art und Weise angeben würden, wie zum Beispiel ein führendes 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 noch benötigt, wenn mit Pfaden im Unix-Stil gearbeitet wird, es gibt jedoch weniger davon.

Kaz
quelle
8
"Der Schrägstrich ist einfach einzugeben und erfordert keine Verschiebung." Vielleicht kommst du dort über den Teich leicht weg, aber hier in Finnland müssen wir nicht nur die Umschalttaste drücken, sondern auch die ganze Zahlenreihe erreichen . ; P
Thomas Nyman
1
@ThomasNyman Wie auch immer, ausländische Tastaturlayouts waren für Ken Thompson wahrscheinlich kein Problem. Der Schrägstrich war für die Unix-Entwickler und ihre frühen Benutzer leicht einzugeben.
Kaz
1
Fair genug. Obwohl ich hauptsächlich Spaß gemacht habe, finde ich es interessant (und manchmal amüsant), wie einige Besonderheiten in Software mit langer Tradition durch Besonderheiten in der zeitgenössischen Hardware erklärt werden können .
Thomas Nyman
@ThomasNyman Haha, ich frage mich, ob sich Bill Joy selbst anmeldet und die {citation-needed} -Teile auf dieser ADM-3A-Seite aktualisiert. Werden einige "Wikidickhead" dann mit "Dieser Artikel enthält Originalrecherchen" kontern. :)
Kaz
@ThomasNyman, jetzt glaube ich, dass es "Pedal" -Tastaturen gibt, mit denen Sie /mit dem rechten Fuß tippen können . Genau wie beim Klavierspielen.
Pacerier