Unterschied zwischen 'cd' und 'cd ~'

10

Ich frage mich, ob cd mich alleine in meinen Home-Ordner schickt und cd ~ dasselbe tut, warum wurde das ~ dann überhaupt hinzugefügt?

Ist es etwas Spezifisches für BASH oder würden sie sich in einer anderen Shell anders verhalten?

Luis Alvarado
quelle
2
Auf keinen Fall ein Duplikat. Diese Frage fragt nach cd ~vs cd $HOMEvs cd ~not-tandu. Diese Frage stellt etwa cdvs cd ~.

Antworten:

17

Das ~kann für mehr als nur das verwendet werden. Jeder Befehl kann von einer Verknüpfung zum Basisordner profitieren. Es ist also nicht notwendig, wenn Sie eine CD in Ihr Zuhause aufnehmen möchten, aber wie sieht es aus ~/.config?

$ cd ~/.config

Andernfalls müssten Sie den Home-Pfad ausschreiben, die $HOMEVariable verwenden oder zwei Sekunden ausführen cd. Auch zum Kopieren oder Verschieben von Dateien:

$ cp ~/downloads/some-file some/path/

Da sich die meisten Ihrer Dateien zu Hause befinden, ist es immer gut, eine Verknüpfung zu haben.

ahilsend
quelle
Hallo ahilsend, eigentlich ist meine Frage eher darauf ausgerichtet, warum die 2 Wege gehen. Ich weiß bereits, wie ~ die Variable $ HOME verwendet, aber aus diesem Grund schickt mich "CD" allein auch nach Hause. Warum zwei Wege für den gleichen Zweck?
Luis Alvarado
4
@CYREX Meine Vermutung wäre, die Eingabe für den sehr häufigen Fall zu speichern, dass Sie in Ihr Home-Verzeichnis wechseln möchten.
ein CVn
1
Die andere Verwendung von ~besteht darin, cd ~user/downloadin das Download-Verzeichnis eines Benutzers zu wechseln.
ott--
5

Dabei cd wird grundsätzlich cdohne Argumente und gemäß dem cdVerhalten "... wenn dir kein Dir angegeben wird, ist der Wert der HOME-Shell-Variablen der Standardwert" aufgerufen. (aus dem Bash-Handbuch ). Im Gegensatz cd ~dazu geben Sie dem cdBefehl ein Argument an , das zufällig ausgeführt wird, ~und die Shell führt eine Tilde-Erweiterung durch . Was die Rückkehr zum Home-Verzeichnis des Benutzers betrifft, gibt es keinen Unterschied. In beiden Fällen wird die HOMEUmgebungsvariable abgefragt:

$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'                                      
/usr
/usr

Tatsächlich hat dies auch keinen Unterschied zu cd $HOME. Während cddies eine einzige Aufgabe ist, kann Tilde verwendet werden, um andere Erweiterungen durchzuführen, z. B. ~+für das aktuelle Arbeitsverzeichnis.

Interessanterweise können wir jedoch unset HOMEbrechen cd, ~werden aber trotzdem funktionieren:

$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'                                    
bash: line 0: cd: HOME not set
/usr
/home/xieerqi

Warum ? Wieder antworten Sie im Handbuch:

Wenn HOME nicht festgelegt ist, wird stattdessen das Home-Verzeichnis des Benutzers ersetzt, der die Shell ausführt. Andernfalls wird das Tilde-Präfix durch das Home-Verzeichnis ersetzt, das dem angegebenen Anmeldenamen zugeordnet ist.

Beachten Sie, dass das Deaktivieren anders ist als das Erstellen einer leeren Variablen HOME=und Auswirkungen hat. In der Dokumentation wird speziell über das Aufheben von Variablen gesprochen. Die Variable gleich einer leeren Zeichenfolge zu machen, hat einen entgegengesetzten Effekt wie erwartet:

bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr

Hier können Sie sehen, dass das Erstellen einer HOMEleeren Zeichenfolge sowohl die Tilde als auch das cdVerhalten unterbricht .


Tilde und $HOMEhaben einen gewissen Unterschied und einen anderen Existenzgrund. $HOMEist eine Shell-Variable, die zufällig auch eine der Umgebungsvariablen ist - und die allen Programmen zur Verfügung steht; in C würden Sie verwenden, environ()um darauf zuzugreifen. Im Gegensatz dazu tildehandelt es sich um eine Shell-spezifische Syntax, die eine Tilde-Erweiterung durchführt, obwohl Sie die wordexp()Funktion verwenden können, um eine Shell-ähnliche Erweiterung ( Referenz ) auch in C durchzuführen .

Der Grund für die ~Darstellung HOMEwurde in dieser Frage beantwortet : Es war einmal, dass das Tilde-Zeichen denselben Schlüssel mit dem HOMEADM-3A-Terminal von Lear-Siegler teilte . HOMEIm Gegensatz dazu ist die Umgebungsvariable eine rein symbolische Bedeutung und keine physischen Darstellungen.

Die Tatsache, dass HOMEes sich um eine Umgebungsvariable handelt, ermöglicht es uns außerdem, sie zu deaktivieren, da wir sie nicht mit ~einfachen Mitteln auf etwas anderes einstellen können .

# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'                           

/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'                                

/home/xieerqi

Beachten Sie die leere Zeile, in der zuerst echodie nicht gesetzte Variable ausgegeben wird, und die Tatsache, dass. Im Gegensatz dazu können wir so etwas nicht tun, um zu tilden:

$ bash -c '~=; cd ~;pwd'                                                    
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'                                               
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'                                               
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi

Änderungen HOMEwirken sich jedoch auf Folgendes aus ~:

$ env 'HOME=' bash -c 'echo $HOME; stat ~;'                                 

stat: cannot stat '': No such file or directory

Da dies ~auch als Erweiterungscharakter funktioniert, können wir außerdem Folgendes tun, um das aktuelle Arbeitsverzeichnis anzuzeigen:

$ bash -c 'cd /etc/;stat -c "%n" ~+'                                        
/etc

Wenn wir dies über Umgebungsvariablen tun möchten, müssen PWDund HOMEbleiben wir gleich, oder wenn Sie Dinge wie tun echo $HOME+, ist dies lediglich eine Verkettung von Zeichenfolgen / Variablen. Aber auch hier werden ~+Informationen aus Umgebungsvariablen entfernt:

$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'                             
/usr

HINWEIS : Die Erweiterungen ~+und ~-funktionieren in ksh, aber nicht in dash.


So beantworten Sie einige Ihrer spezifischen Fragen:

Ist es etwas Spezifisches für BASH oder würden sie sich in einer anderen Shell anders verhalten?

Nein, dies sollte ein konsistentes Verhalten sein. ksh, dashUnd csh- alle verhalten sich gleiche mit cdoder cd ~.

warum wurde das ~ dann überhaupt hinzugefügt?

Ich würde Bequemlichkeit und historische Gründe sagen, wie in der verknüpften Antwort über Tilde erläutert. Schließlich wurde mehr als nur die Erweiterung des Home-Verzeichnisses durchgeführt.

Sergiy Kolodyazhnyy
quelle
0

Ganz gleich , ob Sie mehrere Ordnerebenen oben oder unten sind $HOME, die Befehle cdund cd ~das gleiche tun und nicht unterscheiden - es wird Sie zurück zu Ihrem Home - Verzeichnis senden.

JEDOCH: Wenn Sie sich 1 oder mehr Ordnerebenen über HOME befinden und DIREKT in ein Unterverzeichnis 1 oder mehr Ordnerebenen darunter wechseln möchten $HOME, ist tilde ( ~) nützlich, indem Sie Tastenanschläge speichern, wenn Sie den zum Verweisen erforderlichen Text ersetzen zu, $HOMEwenn Sie einen cdBefehl eingeben . Zum Beispiel;

/$ cd    # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3    # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3
P Alexander
quelle
0

~ steht für / home / username location, sodass Sie beim Tippen Zeit sparen. Zum Beispiel ist cd / home / username / Downloads dasselbe wie cd ~ / Downloads, aber weniger tippend. Beide Befehle tun dasselbe und ändern das Arbeitsverzeichnis an diesen Speicherort.

Ionut
quelle
Nicht wirklich. ZB root's Home-Verzeichnis ist normalerweise außerhalb/home
Dmitry Grigoryev