Gibt es einen Unterschied zwischen ~ und $ HOME?

7

Es scheint, dass ~ und $ HOME in Befehlszeilen- und Shell-Skripten gleichwertig sind. Ist das wahr?

Tomcam
quelle

Antworten:

10

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ßnote

Wenn es als ein Befehlsargument verwendet und in der Trennung von anderen Saiten, $HOMEund ~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_fileund of=/Users/techraf/destination_fileenthält einen gültigen Pfad zum ddBefehl.

    • dd if=~/source_file of=~/destination_file wird nicht funktionieren

      Shell übergibt Argumente if=~/source_fileund of=~/destination_filean den ddBefehl 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 HOMEes 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.

Techraf
quelle
Ich habe die Kommentare entfernt. Bitte verwenden Sie chat.stackexchange.com/rooms/38/ask-different-chat oder einen privaten Chat für erweiterte Diskussionen.
Nohillside
Als Randnotiz: Wenn Sie unset HOMEin anderen Shells, wie ksh, zsh, or dashdann echo ~, nicht auf den Pfad Ihres Home-Ordners erweitern.
fd0
Das kshVerhalten von @ fd0 scheint lustig zu sein - es wird nur in den Benutzernamen aufgelöst, wenn no HOMEdefiniert ist.
Techraf
POSIX-Status - Wenn der Anmeldename null ist (dh das Tilde-Präfix enthält nur die Tilde), wird das Tilde-Präfix durch den Wert der Variablen HOME ersetzt. Wenn HOME nicht festgelegt ist, werden die Ergebnisse nicht angegeben. Da die HOME-Variable änderbar ist, bietet die Verwendung von so etwas wie - Vorteile cd ~username. In einem Skript gelangen cd ~"$(id -un)"Sie zum Home-Ordner des Benutzers, unabhängig davon, auf was HOME eingestellt ist.
fd0
0

$HOMEist bei der Anmeldung in einem frühen Stadium ~verfügbar, wenn es nicht verfügbar ist. Der Grund ist, dass dies $HOMEdurch die Systemumgebung definiert wird und ~eine Shell-Verknüpfung ist. Aus diesem Grund $HOMEwird Shell-Scripting bevorzugt.

AB
quelle
3
Könnten Sie genauer erklären, in welchem ​​Moment die Shell die Umgebungsvariable mithilfe der Parametererweiterungssyntax ( $parameter) auflöst (Zitat: " Frühes Anmelden ", damit sie " für Shell-Skripte bevorzugt " wird), aber noch nicht ~?
Techraf