Unterschied zwischen „cd -“ und „cd ~-“

Unterschied zwischen „cd -“ und „cd ~-“

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 cdAbschnitt 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 cdeingebaute 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), cdsieht also direkt den vorherigen Verzeichnisnamen. -wird von der Shell nicht erweitert, cdsieht 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 diecdBefehl:

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 $OLDPWDund kann als Argument für jeden Befehl übergeben werden, nicht nur für cd. Es handelt sich um eine spätere Erweiterung inUnd.

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, $HOMEwenn es [name]sich um eine leere Zeichenfolge handelt, bzw. auf das Home-Verzeichnis des Benutzers , namewenn namees sich um einen gültigen Benutzernamen handelt.

verwandte Informationen