Es scheint, dass ~ und $ HOME in Befehlszeilen- und Shell-Skripten gleichwertig sind. Ist das wahr?
quelle
Es scheint, dass ~ und $ HOME in Befehlszeilen- und Shell-Skripten gleichwertig sind. Ist das wahr?
Es ist bis zu einem gewissen Grad wahr.
$HOME
ist ein Ausdruck für die Erweiterung der Umgebungsvariablen HOME
~
(Tilde) ist eine separate Shell-Erweiterungskomponente,
siehe FußnoteWenn es als ein Befehlsargument verwendet und in der Trennung von anderen Saiten, $HOME
und ~
ist in der Regel gleich.
Es gibt jedoch Fälle, in denen sie sich unterscheiden:
Wenn die Zeichenfolge, die eines von beiden enthält, in Anführungszeichen gesetzt ist, zum Beispiel:
# echo "My home directory is $HOME"
My home directory is /Users/techraf
# echo "My home directory is ~"
My home directory is ~
Wenn sie mit einer Zeichenfolge verknüpft sind, zum Beispiel:
dd if=${HOME}/source_file of=${HOME}/destination_file
wird funktionieren.
Die Shell übergibt Argumente if=/Users/techraf/source_file
und of=/Users/techraf/destination_file
enthält einen gültigen Pfad zum dd
Befehl.
dd if=~/source_file of=~/destination_file
wird nicht funktionieren
Shell übergibt Argumente if=~/source_file
und of=~/destination_file
an den dd
Befehl und meldet einen Fehler, da dieser nicht interpretiert wird ~
.
Fußnote:
Tatsächlich ~
wird es standardmäßig durch den Wert von ersetzt HOME
, aber wenn HOME
es leer ist, wird es in ein Ausgangsverzeichnis aufgelöst:
# echo $HOME
/Users/techraf
# export HOME=/dummy
# echo $HOME
/dummy
# echo ~
/dummy
# unset HOME
# echo $HOME
# echo ~
/Users/techraf
Von man bash
:
Tilde-Erweiterung
Wenn ein Wort mit einem nicht zitierten Tilde-Zeichen (`~ ') beginnt, werden alle Zeichen vor dem ersten nicht zitierten Schrägstrich (oder alle Zeichen, wenn kein nicht zitierter Schrägstrich vorhanden ist) als Tilde-Präfix betrachtet. Wenn keines der Zeichen im Tilde-Präfix in Anführungszeichen gesetzt wird, werden die Zeichen im Tilde-Präfix nach der Tilde als möglicher Anmeldename behandelt. Wenn dieser Anmeldename die Nullzeichenfolge ist, wird die Tilde durch den Wert des Shell-Parameters HOME ersetzt.
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.
unset HOME
in anderen Shells, wieksh, zsh, or dash
dannecho ~
, nicht auf den Pfad Ihres Home-Ordners erweitern.ksh
Verhalten von @ fd0 scheint lustig zu sein - es wird nur in den Benutzernamen aufgelöst, wenn noHOME
definiert ist.cd ~username
. In einem Skript gelangencd ~"$(id -un)"
Sie zum Home-Ordner des Benutzers, unabhängig davon, auf was HOME eingestellt ist.$HOME
ist bei der Anmeldung in einem frühen Stadium~
verfügbar, wenn es nicht verfügbar ist. Der Grund ist, dass dies$HOME
durch die Systemumgebung definiert wird und~
eine Shell-Verknüpfung ist. Aus diesem Grund$HOME
wird Shell-Scripting bevorzugt.quelle
$parameter
) auflöst (Zitat: " Frühes Anmelden ", damit sie " für Shell-Skripte bevorzugt " wird), aber noch nicht~
?