Unterschied zwischen "cd -" und "cd ~ -"

56

Der Bash-Befehl

cd - 

druckt das zuvor verwendete Verzeichnis und wechselt dorthin.

Auf der anderen Seite der Bash-Befehl

cd ~-

Wechselt direkt in das zuvor verwendete Verzeichnis, ohne dass ein Echo zu hören ist.

Ist das der einzige Unterschied? Was ist der Anwendungsfall für jeden der Befehle?

dr01
quelle
3
Ich empfehle Ihnen, keines dieser kniffligen Dinge zu benutzen. Das ist dein Hirn an cd ~-.
DepressedDaniel
10
@DepressedDaniel, auch wenn Sie keine kniffligen Dinge verwenden (wollen), ist es dennoch nützlich zu verstehen, was sich hinter den Kulissen abspielt. Wenn Sie Eckfälle verstehen, können Sie später aus einer Lücke herauskommen, wenn Sie versuchen, etwas anderes zu debuggen.
Anotherdave

Antworten:

81

Hier spielen zwei Dinge eine Rolle. Zunächst wird das -alleinige Verzeichnis zu Ihrem vorherigen Verzeichnis erweitert. Dies wird im cdAbschnitt von man bash(Schwerpunkt Mine) erklärt:

Ein Argument von -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 die Verzeichnisänderung 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. sonst falsch.

Ein einfacher Befehl cd -bringt Sie zurück zu Ihrem vorherigen Verzeichnis und druckt den Namen des Verzeichnisses aus. Der andere Befehl ist im Abschnitt "Tilde Expansion" dokumentiert:

Wenn das Tilde-Präfix a ist ~+, ersetzt der Wert der Shell-Variablen PWD das Tilde-Präfix. Wenn das Tilde-Präfix a ist ~-, wird der Wert der Shell-Variablen OLDPWD, falls festgelegt, ersetzt. Wenn die Zeichen, die der Tilde im Tilde-Präfix folgen, aus einer Zahl N bestehen, die optional mit einem +oder einem -vorangestellt ist, wird das Tilde-Präfix durch das entsprechende Element aus dem Verzeichnisstapel ersetzt, wie es von den mit aufgerufenen eingebauten Verzeichnissen angezeigt würde das Tilde-Präfix als Argument. Wenn die Zeichen, die der Tilde im Tilde-Präfix folgen, aus einer Zahl ohne führendes +oder bestehen -, +wird angenommen.

Dies könnte anhand eines Beispiels verständlicher sein:

$ 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 also "das vorherige Verzeichnis". Das ist der Grund, warum Sie cd -von alleine dorthin zurückgebracht werden, wo Sie waren.

Der Hauptunterschied ist, dass cd -es spezifisch für den cdeingebauten ist. Wenn Sie es versuchen, echo -drucken Sie einfach ein -. Dies ~-ist Teil der Tilde-Erweiterungsfunktionalität und verhält sich ähnlich wie eine Variable. Darum kannst du echo ~-und bekommst etwas Sinnvolles. Sie können es auch in verwenden, cd ~-aber Sie können es auch in jedem anderen Befehl verwenden. Zum Beispiel cp ~-/* .wäre das äquivalent zucp "$OLDPWD"/* .

terdon
quelle
1
set -xDas Ausdrucken des erweiterten Befehls vor der Ausführung kann hilfreich sein, um den Unterschied zu veranschaulichen (oder kann unleserlich laut sein, wenn Sie den Befehl nicht Schritt für Schritt selbst ausführen).
Peter Cordes
1
@terdon heute habe ich gelernt.
Sitilge
Kurz gesagt ... cd ~-/..funktioniert cd -/..nicht!
Ray Foss
13

~-Unterliegt einer Tilde-Erweiterung (siehe man bash), sodass cdder vorherige Verzeichnisname direkt angezeigt wird. -wird von der Shell nicht erweitert, cdsieht es direkt und verhält sich wie dokumentiert:

Ein Argument von - entspricht $ OLDPWD. Wenn ein nicht leerer Verzeichnisname von CDPATH verwendet wird oder - das erste Argument ist und der Verzeichniswechsel erfolgreich ist, wird der absolute Pfadname des neuen Arbeitsverzeichnisses in die Standardausgabe geschrieben.

Choroba
quelle
4

TL; DR: cd -ist eingebaut in cd, ~-ist eine spätere Erweiterung von ~[name], nicht spezifisch für cd.

POSIX.1-2008 Shell & Utilities definiert cd -als Sonderfall, der für den Befehl spezifisch ist :cd

Wenn a -als Operand verwendet wird, muss dies dem folgenden Befehl entsprechen:

cd "$OLDPWD" && pwd

Das ändert sich in das vorherige Arbeitsverzeichnis und schreibt dann seinen Namen.

Die ~-Erweiterung wird erweitert, $OLDPWDbevor ein Befehl ausgeführt wird, und kann nicht nur als Argument für einen Befehl übergeben werden cd. Es ist eine spätere Erweiterung in und .

Der oben erwähnte POSIX.1-2008 Shell & Utilities-Standard enthält auch eine ausführliche Erläuterung der Tilde-Erweiterung . Die Formulierung ist sehr spezifisch für ermöglichen ~-als nicht definiertes Verhalten im Rahmen der Norm, wo ~[name]sich bezieht , $HOMEwenn [name]die leere Zeichenkette ist , oder das Home - Verzeichnis des Benutzers , namewenn nameein gültiger Benutzername ist.

Henk Langeveld
quelle