cd ~
macht das gleiche wie
cd $HOME
das ist auch das gleiche wie
cd /home/tandu
Jedoch,
cd ~not-tandu
ändert sich zu /home/not-tandu
Ist das eine rein syntaktische Entscheidung? Wie wird das vom Kernel (oder der cd
ausführbaren Datei?) Gehandhabt? Gibt es einen Sonderfall für ~
das Hinzufügen des Schrägstrichs, wenn alles andere weggelassen wird? Das heißt, ~/
und ~
wechseln Sie in das gleiche Verzeichnis, ist aber ~a
ein Verzeichnis auf. Dies gilt nicht für andere Verzeichnisse, in die Sie wechseln.
cd-command
home
Explosionspillen
quelle
quelle
cd
Ohne Parameter funktioniert das wiecd ~
. Wenn Sie ersetzencd
mitecho
können Sie sehen , was der Ausdruck von der Shell erweitert wird.Antworten:
~
ist ein Alias für$HOME
eine Reihe von Muscheln,$HOME
ist aber universeller.$HOME
fordert die Shell auf, die Umgebungsvariable HOME hier einzufügen (zu ersetzen). Es gibt eine ganze Reihe verschiedener Umgebungsvariablen, die ersetzt werden können. Versuchen Sie,env
eine Liste zu erstellen . Beachten Sie, dass dies~
nicht immer erkannt wird, wenn es nicht am Anfang eines Wortes steht. Probieren Sie diese beiden Befehle zum Vergleich aus:Das erste wird an die ausführbare
/~
Datei ls übergeben, die dann versucht, eine~
im Stammverzeichnis aufgerufene Datei zu suchen , das zweite wird erweitert$HOME
und//home/user
als Befehlszeilenargument an die ausführbare Datei ls übergeben. Alle POSIX - Systemen (POSIX ist der Standard für wie UNIX und Linux - Systeme arbeiten) können mehrere Schrägstriche gleich behandelt werden , wie man so Slash//home/user
ist die gleiche wie zu sagen/home/user
.~username
ist eine Abkürzung, mit der die Shell angewiesen wird, den Benutzernamen in der passwd-Datei nachzuschlagen und ihr Ausgangsverzeichnis zurückzugeben. Es gibt keine äquivalente Umgebungsvariable. Alle diese Ersetzungen werden von der Shell vorgenommen und von den meisten von ihnen unterstützt, aber nur Umgebungsvariablen wie$HOME
werden garantiert von allen Shells unterstützt. Ebenfalls,cd
ist eigentlich ein eingebauter Befehl. Es ist eine spezielle Anweisung, die die Shell selbst anweist, die Verzeichnisse zu ändern. Es ist nicht wie bei anderen Shell-Built-Ins, die als separate ausführbare Datei implementiert werden können, da hiermitecho
ein grundlegendes Attribut des Shell-Prozesses geändert wird.echo
ist lediglich eine aus Performancegründen eingebaute Shell, die in den guten alten Tagen von UNIX nur als eigene ausführbare Datei zur Verfügung stand/bin/echo
.quelle
~foo
bedeutet "das Home-Verzeichnis des Benutzers foo".Dies wird nicht vom Kernel gemacht, sondern von der Shell interpretiert. Wenn die Shell
~foo
ein Argument sieht , ersetzt sie es transparent durch das Ausgangsverzeichnis des Benutzersfoo
und übergibt es an seine Stelle. Wenn Sie also ausführencd ~tandu
, wird die Shell tatsächlich ausgeführtcd /home/tandu
.quelle
cd
oder die Muschel? Was ist, wenn Sie keine Shell ausführen? Ist es ein einfaches "Wenn ~ von etwas gefolgt wird, anders erweitern?" oder gibt es eine andere spezielle Behandlung für diesen einzigartigen Zustand?cd
, es gibt keine externe ausführbare Datei, um es zu tun (es wäre nicht möglich)exec(2)
), findet keine Shell-Erweiterung statt. Ohne Shell-Erweiterung wird~
es nicht durch irgendetwas ersetzt - es ist nur ein weiteres perfekt gültiges Zeichen. Das hat mich in meinen frühen SunOS-Tagen/bin/sh
gebissen, weil ich nicht grokam~
.~
gefolgt von einem Benutzernamen wird in das Basisverzeichnis dieses Benutzers erweitert.quelle