cd .. im Hauptordner


44

Warum cd ..wird im Stammordner keine Warnung ausgegeben oder es tritt ein Fehler auf?

Ich würde erwarten:

/$ cd ..
-bash: cd: ..: No such file or directory

Stattdessen bleibe ich bei /. Natürlich gibt es das da ..in /und ist einfach /nur so .. Ich frage mich nur, warum das so ist.


6
Keine Antwort, aber hier ist eine gute zugehörige Lektüre, Rob Pike über G +, der die Herkunft der Punktdatei (en) bespricht.
bsd

Antworten:


53

Laut der Open Group (verantwortlich für den POSIX-Standard):

Jedes Verzeichnis hat genau ein übergeordnetes Verzeichnis, das im ersten Verzeichnis durch den Namen Punkt-Punkt dargestellt wird . [...] Auf was sich der Dateiname Punkt-Punkt relativ zum Stammverzeichnis bezieht, ist implementierungsdefiniert. In Version 7 bezieht es sich auf das Stammverzeichnis selbst; Dies ist das in POSIX.1-2008 erwähnte Verhalten. In einigen vernetzten Systemen wird die Konstruktion /../hostname/ verwendet, um auf das Stammverzeichnis eines anderen Hosts zu verweisen, und POSIX.1 lässt dieses Verhalten zu.

(Quelle)


29

Sie haben nicht einen Fehler, denn auch das /Verzeichnis tatsächlich hat einen gültigen Verzeichniseintrag für .., aber im Gegensatz zu anderen Verzeichnissen verweist er auf das Verzeichnis selbst und verhält sich somit identisch mit .:

$ ls -lid / /. /..
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /.
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /..
$

Wie die erste Spalte zeigt Ihnen, ., .., und/ alle dieselbe Inode-Nummer und sind daher dieselben Dateisystemeinträge.

Also auch wenn du cd ..in /dir bleibst /.


13
In der Frage wird gefragt, warum der ..Verzeichniseintrag vorhanden ist.
Nick Matteo

3
Der einzige Grund , dass mir in den Sinn kommt, ist , dass Sie behandeln wollen /für wie jeder andere Ordner, darunter ein gültiger Eintrag ... Andernfalls müssten Sie /anders als alle anderen Ordner im System behandeln.
Dohn Joe

15

Es ist vorhanden, da zum Entfernen Code für die Behandlung von Sonderfällen im Kernel und in den C-Bibliotheken erstellt werden muss. Im Moment können Sie davon ausgehen, dass es immer ein '.' und ".." in jedem Verzeichnis, in das Sie gehen.

Der einzige derzeit erforderliche Sonderfallcode ist der Dateisystem-Mount-Code, bei dem der Code den Inode-Wert von '..' überschreibt, um auf das Verzeichnis zu verweisen, das den Mount-Punkt enthält, da Root-Verzeichnisse nicht immer Root-Verzeichnisse sind.


Es ist doch unmöglich, dass "Eltern-Überweisung" in Baumstrukturen frei von Sonderfällen ist, oder? Die Wurzel muss per Definition speziell sein, und jeder Versuch zu maskieren, der zu Sonderfällen oder Verwirrung an anderer Stelle führt.
Musiphil

@musiphil Unter Unix werden die Sonderfälle hier an den mountBefehl und die zugehörige Spezialdatei übergeben /etc/fstab.
Luser Droog

1

Eine andere Möglichkeit, um zu überprüfen, was .und ..in was /wirklich ist:

$ readlink -f ..
/home

$ readlink -f /.
/

$ readlink -f /..
/

Wie Sie sehen können .und ..darauf hingewiesen wird /.


1

Ein weiterer Grund, warum '..' in / ist, ist, dass es einen weiteren Sonderfall geben würde, wenn es nicht vorhanden wäre: Das Stammverzeichnis hätte eine feste Verknüpfung weniger als alle anderen Verzeichnisse (alle Verzeichnisknoten haben n + 2 Verknüpfungen, wobei n ist die Anzahl der direkten Unterverzeichnisse innerhalb). Dies würde verschiedene Programme zum Absturz bringen, die sich auf die Optimierung von Verzeichnis-Scans stützen.


0

Es ist schön, dass es da ist, weil ich sonst nicht in der Lage wäre, Spam ../../../../von einem Ordner an den Stamm zu senden. Wenn es nicht zulässt, ..dass sich der Ordner im Stammverzeichnis befindet, stecke ich fest, wenn ich die Anzahl der Ordner im Arbeitsverzeichnis zähle.


10
Was ist los mit cd /?
Bach

@ Bach Manchmal macht das Mischen mit der Tastatur mehr Spaß. Außerdem versuchen Sie in vielen Fällen nicht, zur Wurzel zu gelangen. In diesem Fall ../ist die Verwendung besser. Ich führe auch viele Dateioperationen in PHP durch, was /aus verschiedenen Gründen nicht möglich ist.
Skylar Ittner

2
Die Kehrseite ist, dass Sie möglicherweise versehentlich zu viele ../s eingeben und eine Datei bearbeiten (oder entfernen), die Sie nicht ohne Fehler beabsichtigt haben.
Jamesdlin

4
../Mehr als nötig zu wiederholen und zu wollen, dass es wie beabsichtigt funktioniert, scheint mir ein (ruhender) logischer Fehler zu sein, auch wenn das Dateisystem es anscheinend zulässt.
Musiphil

@musiphil Leerzeichen zwischen Befehlen eingeben - ist ein logischer Fehler (Annahme, dass alle Leerzeichen zwischen tail -f | grep ein Muss sind). Die meisten Unix-Leute leiden darunter. Die Eingabe von "../ .." scheint ein Windows-Problem zu sein (standardmäßig wird cmd in X: \ Windows gestartet und Sie müssen von Anfang an spammen). Warum ein kleines Problem heilen, wenn es ein größeres gibt? (Leerzeichen)
kagali-san
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.