
CD ~
macht das gleiche wie
cd $HOME
was auch dasselbe ist wie
cd /home/tandu
Jedoch,
cd ~not-tandu
Änderungen an/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, um ~
den Schrägstrich hinzuzufügen, wenn alles andere weggelassen wird? Das heißt, ~/
und ~
in dasselbe Verzeichnis wechseln, aber ~a
ein Verzeichnis höher. Das Gleiche kann nicht für jedes andere Verzeichnis gesagt werden, in das Sie wechseln.
Antwort1
~
ist ein Alias für , der $HOME
von einer Reihe von Shells bereitgestellt wird, aber $HOME
universeller ist. $HOME
fordert die Shell tatsächlich 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 auszuführen. Beachten Sie, dass dies ~
nicht immer erkannt wird, wenn es nicht am Anfang eines Wortes steht. Versuchen Sie zum Vergleich diese beiden Befehle:
ls /~
ls /$HOME
Das erste wird an die ausführbare Datei ls übergeben, die dann versucht, eine Datei namens im Stammverzeichnis /~
anzuschauen , das zweite wird erweitert und wird zu , das dann als Kommandozeilenargument an die ausführbare Datei ls übergeben wird. Alle POSIX-Systeme (POSIX ist der Standard für die Funktionsweise von UNIX- und Linux-Systemen) erlauben, mehrere Schrägstriche wie einen Schrägstrich zu behandeln, ist also dasselbe wie zu sagen . ist eine Abkürzung, um der Shell mitzuteilen, dass sie den Benutzernamen in der Datei passwd nachschlagen und ihr Home-Verzeichnis zurückgeben soll. 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 werden garantiert von allen Shells unterstützt. Außerdem ist eigentlich ein integrierter Befehl. Es ist eine spezielle Anweisung, die der Shell selbst sagt, dass sie das Verzeichnis wechseln soll. Es ist nicht wie andere integrierte Shell-Befehle, die als separate ausführbare Datei implementiert werden können, wie ist, weil es verwendet wird, um ein grundlegendes Attribut des Shell-Prozesses zu ändern. ist lediglich eine aus Leistungsgründen integrierte Shell, war in der guten alten Zeit von UNIX jedoch nur als eigene ausführbare Datei verfügbar .~
$HOME
//home/user
//home/user
/home/user
~username
$HOME
cd
echo
echo
/bin/echo
Antwort2
~foo
bedeutet „das Home-Verzeichnis des Benutzers foo“.
Dies wird nicht vom Kernel erledigt, sondern von der Shell interpretiert. Wenn die Shell ~foo
als Argument sieht, ersetzt sie es transparent durch das Home-Verzeichnis des Benutzers foo
und übergibt dieses an seiner Stelle. Wenn Sie also ausführen cd ~tandu
, wird die Shell tatsächlich ausgeführt cd /home/tandu
.
Antwort3
~
gefolgt von einem Benutzernamen wird zum Home-Verzeichnis dieses Benutzers erweitert.