~ ist $ HOME, aber manchmal?

14

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 cdausfü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 ~aein Verzeichnis auf. Dies gilt nicht für andere Verzeichnisse, in die Sie wechseln.

Explosionspillen
quelle
3
Fühlen Sie sich frei, ~ not-tandu und ~ / not-tandu zu vergleichen, wobei einer auf den Benutzer not-tandu home dir und der andere auf den Ordner not-tandu in Ihrem Homedir verweist.
Johan
4
Es ist nicht der Kernel oder die "ausführbare CD" (da es so etwas nicht gibt) - es ist eine eingebaute Shell.
Paul Tomblin
Da erwähnen Sie es nicht: cdOhne Parameter funktioniert das wie cd ~. Wenn Sie ersetzen cdmit echokönnen Sie sehen , was der Ausdruck von der Shell erweitert wird.
Jofel

Antworten:

18

~ist ein Alias ​​für $HOMEeine Reihe von Muscheln, $HOMEist aber universeller. $HOMEfordert 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, enveine 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:

ls /~
ls /$HOME

Das erste wird an die ausführbare /~Datei ls übergeben, die dann versucht, eine ~im Stammverzeichnis aufgerufene Datei zu suchen , das zweite wird erweitert $HOMEund //home/userals 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/userist die gleiche wie zu sagen /home/user. ~usernameist 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 $HOMEwerden garantiert von allen Shells unterstützt. Ebenfalls,cdist 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 hiermit echoein grundlegendes Attribut des Shell-Prozesses geändert wird. echoist 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.

penguin359
quelle
re "der dann versucht, eine Datei mit dem Namen ~ im Stammverzeichnis zu suchen"; Das ist für alle Unix-Aromen?
Pacerier
17

~foo bedeutet "das Home-Verzeichnis des Benutzers foo".

Dies wird nicht vom Kernel gemacht, sondern von der Shell interpretiert. Wenn die Shell ~fooein Argument sieht , ersetzt sie es transparent durch das Ausgangsverzeichnis des Benutzers foound übergibt es an seine Stelle. Wenn Sie also ausführen cd ~tandu, wird die Shell tatsächlich ausgeführt cd /home/tandu.

Patrick
quelle
1
Was bedeutet dieser Ersatz konkret und mit welchem ​​Algorithmus? Ist es cdoder 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?
Explosion Pills
8
Weitere Informationen finden Sie im Bash-Handbuch zur Tilde-Erweiterung . (Viele andere Shells und Programme folgen ähnlichen Regeln.)
cjm
4
@ Tandu: Die Shell tut cd, es gibt keine externe ausführbare Datei, um es zu tun (es wäre nicht möglich)
Mat
1
@tandu: Wenn Sie keine Shell ausführen (z. B. dies mit ausprobieren 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/shgebissen, weil ich nicht grokam ~.
Alexios
5

~ gefolgt von einem Benutzernamen wird in das Basisverzeichnis dieses Benutzers erweitert.

Ignacio Vazquez-Abrams
quelle