Welches Verzeichnis repräsentiert der Pfad `//` in Linux?

13

Wenn ich unter Linux durch Eingabe zum cd ..übergeordneten Verzeichnis zurückkehren möchte , habe ich getippt cd //. Zu meiner großen Überraschung werden keine Fehler gemeldet. Außerdem wird die Eingabeaufforderung username@hostname://$. lszeigt an, dass ich mich jetzt im Stammverzeichnis befinde.

Ist das ein Bug oder ein Feature der Shell? Wenn ein Feature, ist //ein Alias ​​von /? Meine Shell ist GNU Bash, Version 4.1.5 (1) -Release (i686-linux-gnu).

Danke und viele Grüße.

Sommer_Mehr_Mehr_Tee
quelle
Siehe superuser.com/q/314102/91047
Stéphane Gimenez

Antworten:

30

Es kann entweder berücksichtigt werden.

Unter Linux //bedeutet das nichts - mehrere aufeinanderfolgende Schrägstriche werden an einer beliebigen Stelle im Pfad, einschließlich des Anfangs, zu einem zusammengefasst. Wechseln des Verzeichnisses, um //Sie einzuloggen /, wie das Ausführen zeigen readlink /proc/self/cwdwürde; ebenso /usr//local///binist zusammengebrochen /usr/local/bin.

Einige andere Unix-ähnliche Systeme, z. B. Cygwin oder das alte Apollo Domain / OS, verwenden das // Präfix jedoch für Netzwerkpfade wie z //fileserver/path/to/data. POSIX ermöglicht dies ebenfalls.

Aus verschiedenen Gründen verfolgt die Bash- Shell das aktuelle Verzeichnis selbstständig (zusätzlich zum vom Betriebssystem bereitgestellten Tracking) und enthält Code, der verhindert, dass die Initiale //komprimiert wird, um mit solchen Systemen kompatibel zu bleiben. Das "Feature" ist, dass Bash eine intuitivere Verfolgung des aktuellen Verzeichnisses ermöglicht. Wenn Sie beispielsweise cdeinen Symlink aufrufen, zeigt Bash den erwarteten Pfad an, auch wenn der Kernel anders denkt. Der "Bug" ist, dass Bash// auch auf Systemen erlaubt , die es nicht benutzen.

user1686
quelle
Interessanterweise zsherlaubt cd //, ist aber schlau genug, um nur /in der Eingabeaufforderung Zeichenfolge anzuzeigen.
new123456
@BinaryZebra Bitsavers hat eine Sammlung alter Unix-Handbücher, einschließlich Apollo's - es sollte dort viele Beispiele geben. Die TUHS-Website sollte auch etwas haben.
user1686
Vielen Dank, ich habe die Beschreibung für // im Handbuch von Bitsavers gefunden.
9

Aus der POSIX-Pfadnamendefinition:

Ein Pfadname kann optional einen oder mehrere abschließende Schrägstriche enthalten. Mehrere aufeinanderfolgende Schrägstriche entsprechen einem Schrägstrich.

Quelle

Und genauer gesagt, wie Grawity in seinem Kommentar unten aus dem Kapitel 4.11 über die Auflösung von Pfadnamen erwähnte :

Ein Pfadname, der mit zwei aufeinanderfolgenden Schrägstrichen beginnt, kann implementierungsdefiniert interpretiert werden, obwohl mehr als zwei führende Schrägstriche als ein einzelner Schrägstrich behandelt werden sollen.

Shadok
quelle
1
Ein geeigneterer Abschnitt ist 4.11 Pathname Resolution (letzter Absatz), da das fragliche Verhalten nur für zwei führende Schrägstriche angezeigt wird .
user1686
3

Es ist eine Art Feature. Wenn Sie ein Shell-Skript verwenden find, wird beispielsweise allen Pfaden in der Regel das Präfix ./ vorangestellt. Wenn Sie das auf einem tatsächlichen Pfad anheften, wird es zu "/my/path/./appended/path", das in "/ my / path / appended / path" aufgelöst wird. Also, wenn ich mich nicht irre, // wird interpretiert als /./ und daher /. Dies gilt auch für den Fall, dass Sie nach / home / user // gegangen sind und sich in / home / user / befinden.

Chuck R
quelle
1

Ich würde mich für eine Eingabeaufforderung entscheiden, die "Fehler" anzeigt.

Beide Pfade "/", "//", "////////////////////////", ... haben dieselbe Bedeutung: "/". Sie können beliebig viele "/" in einen Unix-Pfad einfügen, ohne die Bedeutung zu ändern.

Der "Bug" hängt hier eher damit zusammen, dass Ihre Eingabeaufforderung den zuletzt eingegebenen gültigen Pfad für die Anzeige verwendet, nicht den tatsächlichen "pwd".

Komisch sowieso;)

Ouki
quelle
Einverstanden - das //in der Eingabeaufforderung ist ein Nebeneffekt Ihrer Eingabeaufforderungs-Umgebungsvariablen ( $PS1) - wie ist das PS1definiert?
Doug Harris
@DougHarris Die $PS1Variable ist definiert als [\u@\h \W]\$. Probleme mit der Einstellung?
Summer_More_More_Tea
Seltsam. Wenn ich diese PS1 probiere, bekomme ich nur eine /wenn pwd = /. Ich habe mich gefragt, ob Sie zusätzliche Arbeit leisten, um das Verzeichnis zu erhalten. Ist $PROMPT_COMMANDeingestellt?
Doug Harris
@DougHarris Ja, diese Variable ist gesetzt, deren Wert ist echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007". Könnten Sie bitte etwas näher erläutern? Ich bin mit diesen beiden Variablen nicht ganz vertraut. Vielen Dank.
Summer_More_More_Tea
Lesen Sie die Bash-Manpage und suchen Sie nach PS1und PROMPT_COMMAND- verwenden Sie sie man bashin Ihrer Befehlszeile oder lesen Sie online
Doug Harris
1

Es ist ein Feature und alle multiplen // werden durch ein einzelnes / ersetzt.

Dies ist nützlich, wenn Sie Variablen mit Pfaden wie im Beispiel am Ende haben. Ihre CD würde also keinen Fehler bekommen und Sie müssen die Arbeitsbereichsvariable nicht ändern.

MY_WORKSPACE = / home / ihr_benutzername / arbeitsbereich /
MY_NEW_PROJECT = $ MY_WORKSPACE / my_proj /
cd $ MY_NEW_PROJECT 

Der vollständige Inhalt der Projektvariablen ist

/ home / ihr_benutzername / arbeitsbereich // mein_projekt /

phschoen
quelle