
Der Bash-Befehl
cd -
druckt das zuvor verwendete Verzeichnis und wechselt dorthin.
Andererseits der Bash-Befehl
cd ~-
wechselt direkt in das zuvor verwendete Verzeichnis, ohne etwas auszugeben.
Ist das der einzige Unterschied? Was ist der Anwendungsfall für jeden der Befehle?
Antwort1
Hier spielen zwei Dinge eine Rolle. Erstens -
wird das Alone-Verzeichnis in Ihr vorheriges Verzeichnis erweitert. Dies wird im cd
Abschnitt man bash
(Hervorhebung von mir) erklärt:
Ein Argument
-
wird in $OLDPWD konvertiert, bevor der Verzeichniswechsel versucht wird. Wenn ein nicht leerer Verzeichnisname von CDPATH verwendet wird oder wenn-
das erste Argument ist und der Verzeichniswechsel erfolgreich ist, wird der absolute Pfadname des neuen Arbeitsverzeichnisses in die Standardausgabe geschrieben. Der Rückgabewert ist „true“, wenn das Verzeichnis erfolgreich geändert wurde, andernfalls „false“.
Ein einfacher Befehl bringt Sie also cd -
zurück in Ihr vorheriges Verzeichnis und gibt den Namen des Verzeichnisses aus. Der andere Befehl ist im Abschnitt „Tilde-Erweiterung“ dokumentiert:
Falls das Tilde-Präfix ein ist
~+
, wird es durch den Wert der Shell-Variablen PWD ersetzt. Falls das Tilde-Präfix ein ist, wird es durch den~-
Wert der Shell-Variablen OLDPWD ersetzt, sofern diese gesetzt ist. Falls die auf die Tilde folgenden Zeichen im Tilde-Präfix aus einer Zahl N bestehen, optional mit dem Präfix a+
oder a-
, wird das Tilde-Präfix durch das entsprechende Element aus dem Verzeichnisstapel ersetzt, wie es vom integrierten Programm „dirs“ angezeigt würde, das mit dem Tilde-Präfix als Argument aufgerufen wird. Falls die auf die Tilde folgenden Zeichen im Tilde-Präfix aus einer Zahl ohne vorangestelltes+
oder bestehen-
,+
wird angenommen.
Dies lässt sich vielleicht anhand eines Beispiels leichter verstehen:
$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~ ## prints $HOME
/home/terdon
$ echo ~+ ## prints $PWD
/etc
$ echo ~- ## prints $OLDPWD
/home/terdon/foo
Im Allgemeinen -
bedeutet „das vorherige Verzeichnis“. Deshalb cd -
werden Sie automatisch dorthin zurückgeführt, wo Sie waren.
Der Hauptunterschied besteht darin, dass es cd -
spezifisch für das cd
eingebaute ist. Wenn Sie versuchen, echo -
wird nur ein ausgegeben -
. Das ~-
ist Teil der Tilde-Erweiterungsfunktion und verhält sich ähnlich wie eine Variable. Deshalb können Sie echo ~-
und erhalten etwas Sinnvolles. Sie können es auch in verwenden, cd ~-
aber Sie können es genauso gut in jedem anderen Befehl verwenden. Zum Beispiel cp ~-/* .
wäre das gleichbedeutend mitcp "$OLDPWD"/* .
Antwort2
~-
unterliegt der Tilde-Erweiterung (siehe man bash), cd
sieht also direkt den vorherigen Verzeichnisnamen. -
wird von der Shell nicht erweitert, cd
sieht ihn direkt und verhält sich wie dokumentiert:
Ein Argument von - ist gleichbedeutend mit $OLDPWD. Wenn ein nicht leerer Verzeichnisname von CDPATH verwendet wird oder wenn - das erste Argument ist und der Verzeichniswechsel erfolgreich ist, wird der absolute Pfadname des neuen Arbeitsverzeichnisses in die Standardausgabe geschrieben.
Antwort3
TL;DR: cd -
ist in integriert cd
, ~-
ist eine spätere Erweiterung von ~[name]
, nicht spezifisch für cd
.
POSIX.1-2008 Shell und Dienstprogrammedefiniert cd -
als Sonderfall, derSpezifischfür diecd
Befehl:
Wenn a
-
als Operand verwendet wird, entspricht dies dem Befehl:
cd "$OLDPWD" && pwd
welches in das bisherige Arbeitsverzeichnis wechselt und anschließend dessen Namen schreibt.
Die ~-
Erweiterung wird vor der Ausführung eines Befehls auf erweitert $OLDPWD
und kann als Argument für jeden Befehl übergeben werden, nicht nur für cd
. Es handelt sich um eine spätere Erweiterung inkshUndSchlag.
Der oben erwähnte Shell & Utilities-Standard POSIX.1-2008 hat aucheine ausführliche Erklärung der Tilde-Erweiterung~-
. Die Formulierung ist sehr spezifisch, um ein als undefiniert geltendes Verhalten im Rahmen des Standards zuzulassen , wobei ~[name]
sich auf bezieht, $HOME
wenn es [name]
sich um eine leere Zeichenfolge handelt, bzw. auf das Home-Verzeichnis des Benutzers , name
wenn name
es sich um einen gültigen Benutzernamen handelt.