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://$
. ls
zeigt 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.
Antworten:
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 zeigenreadlink /proc/self/cwd
würde; ebenso/usr//local///bin
ist 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 beispielsweisecd
einen 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.quelle
zsh
erlaubtcd //
, ist aber schlau genug, um nur/
in der Eingabeaufforderung Zeichenfolge anzuzeigen.Aus der POSIX-Pfadnamendefinition:
Quelle
Und genauer gesagt, wie Grawity in seinem Kommentar unten aus dem Kapitel 4.11 über die Auflösung von Pfadnamen erwähnte :
quelle
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.quelle
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;)
quelle
//
in der Eingabeaufforderung ist ein Nebeneffekt Ihrer Eingabeaufforderungs-Umgebungsvariablen ($PS1
) - wie ist dasPS1
definiert?$PS1
Variable ist definiert als[\u@\h \W]\$
. Probleme mit der Einstellung?/
wenn pwd =/
. Ich habe mich gefragt, ob Sie zusätzliche Arbeit leisten, um das Verzeichnis zu erhalten. Ist$PROMPT_COMMAND
eingestellt?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.PS1
undPROMPT_COMMAND
- verwenden Sie sieman bash
in Ihrer Befehlszeile oder lesen Sie onlineEs 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.
Der vollständige Inhalt der Projektvariablen ist
quelle