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?
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?
Antworten:
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 $HOME
Variable 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.
~
besteht darin, cd ~user/download
in das Download-Verzeichnis eines Benutzers zu wechseln.
Dabei cd
wird grundsätzlich cd
ohne Argumente und gemäß dem cd
Verhalten "... 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 cd
Befehl 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 HOME
Umgebungsvariable abgefragt:
$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'
/usr
/usr
Tatsächlich hat dies auch keinen Unterschied zu cd $HOME
. Während cd
dies 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 HOME
brechen 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 HOME
leeren Zeichenfolge sowohl die Tilde als auch das cd
Verhalten unterbricht .
Tilde und $HOME
haben einen gewissen Unterschied und einen anderen Existenzgrund. $HOME
ist 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 tilde
handelt 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 HOME
wurde in dieser Frage beantwortet : Es war einmal, dass das Tilde-Zeichen denselben Schlüssel mit dem HOME
ADM-3A-Terminal von Lear-Siegler teilte . HOME
Im Gegensatz dazu ist die Umgebungsvariable eine rein symbolische Bedeutung und keine physischen Darstellungen.
Die Tatsache, dass HOME
es 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 echo
die 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 HOME
wirken 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 PWD
und HOME
bleiben 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
, dash
Und csh
- alle verhalten sich gleiche mit cd
oder 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.
Ganz gleich , ob Sie mehrere Ordnerebenen oben oder unten sind $HOME
, die Befehle cd
und 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, $HOME
wenn Sie einen cd
Befehl 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
~ 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.
root
's Home-Verzeichnis ist normalerweise außerhalb/home
cd ~
vscd $HOME
vscd ~not-tandu
. Diese Frage stellt etwacd
vscd ~
.