Différence entre $ HOME et ~

31

$HOMEet ~se réfèrent généralement à la même chose. C'est-à-dire qu'ils sont le chemin vers le répertoire "home de l'utilisateur" qui a la forme générale "/ home / userName".

Quand, si jamais, ceux-ci ne font pas référence au même répertoire?

H2ONaCl
la source
11
Le ~dépend du shell tandis que $ HOME ne l'est pas.
Kulfy
Très bien lié unix.stackexchange.com/a/400715/85039
Sergiy Kolodyazhnyy

Réponses:

45

Les deux $HOMEet ~pointent vers le même dossier, le dossier de l'utilisateur actuel, mais les deux sont des choses très différentes.

  • $HOMEest une variable d'environnement qui est définie pour contenir le dossier de départ de l'utilisateur actuel.
  • ~est un symbole d'expansion du shell , c'est-à-dire l'un des symboles qui est traité avant l'exécution de la commande réelle. ~seule augmente à la valeur de $ HOME. ~nemose développe dans le répertoire personnel de l'utilisateur nemo. Un symbole d'extension de shell est un caractère (ou une paire de caractères) qui est traité / interprété par le shell pour générer la commande réelle. Un autre exemple de symbole d'extension de shell *est utilisé pour développer les noms de fichiers.
vanadium
la source
1
~se développe en $ HOME ou% APPDATA% sous Windows. S'ils ne sont pas définis, il recherchera le chemin dans "la base de données de mots de passe" (ce qui signifie généralement /etc/passwd, mais peut être LDAP ou une autre source de données). Il y a environ 20 ans, vous auriez pu être averti que $ HOME pourrait ne pas être défini sur certaines machines, alors qu'il ~était garanti de s'étendre à quelque chose.
Mirek Długosz
Cette différence est notable dans des programmes comme make, quand vous avez besoin de savoir lequel des deux vous avez besoin
D. Ben Knoble
3
@ MirekDługosz Au moins sur git bash sous Windows, se ~développe en $HOME(égal à $HOMEPATH), non $APPDATA. Et sur cmd.exe, ~ne se développe pas.
hyde
1
@vanadium HOMEest une variable d'environnement (un concept de système d' exploitation, en sh coquilles par exemple ensemble avec exportou declare -x), et non une variable shell (définition dont dépend entièrement de la coquille, mais sh coquilles , il est généralement réglé avec foo=valueou avec setou dans quelques autres façons).
hyde
1
@hyde j'ai mal formulé cela. bash vérifiera $ HOME, s'il n'est pas défini, il vérifiera% APPDATA%, mais uniquement sous Windows; s'il n'est pas défini, il recherchera "la base de données de mots de passe". Voir git.savannah.gnu.org/cgit/bash.git/tree/lib/readline/…
Mirek Długosz
17

Une façon dont ils diffèrent réside dans la façon dont le shell Bash les convertit lorsqu'il est placé entre "guillemets.

Si vous utilisez echocomme ceci, sans guillemets, alors ~et $HOMEavez le même effet:

$ echo ~
/home/elias
$ echo $HOME
/home/elias

Cependant, avec des "guillemets autour d'eux, le résultat diffère:

$ echo "~"
~
$ echo "$HOME"
/home/elias
Elias
la source
13

~ne se développe que dans le cadre d'un préfixe tilde qui, par définition, doit commencer au début du mot. De plus, comme il faisait autrefois partie des modèles de globalisation, ~ne fonctionnera pas dans les guillemets doubles. Donc, "~"ou a~bentraînera une valeur littérale d' ~être préservé.

Un seul ~(ou un ~suivi d'un /) s'étendra au domicile de l'utilisateur actuel:

$ echo ~/.ssh
/home/user/.ssh

Un ~suivi d'un nom d'utilisateur se développera dans le dossier d'accueil de cet utilisateur:

$ echo ~root/.ssh
/root/.ssh

Un ~suivi d'un +ou d'un -et d'un numéro facultatif s'étendra aux éléments de la pile de répertoires :

$ cd /etc
$ echo ~+0
/etc

$HOMEest l'équivalent d'un simple ~, qui suit à la place des règles de syntaxe pour les variables. Par exemple, il se développe entre guillemets doubles, peut être non défini et des opérandes de manipulation de chaînes peuvent lui être appliqués.

Dmitry Grigoryev
la source
3

Cela dépend beaucoup de ce que fait l'expansion. En bash, ~est un moyen pratique d'obtenir le répertoire personnel sans déclencher l'expansion du nom de fichier ou le fractionnement des mots même s'il n'est pas cité. Par exemple:

$ HOME='/*'
$ echo $HOME
/bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
$ echo ~
/*

Ou:

$ HOME='/ a b'
$ printf "|%s|\n" $HOME ~
|/|
|a|
|b|
|/ a b|

Donc, si vous luttez avec des citations pour une raison quelconque (auquel cas vous devriez vraiment repenser le tout, il est plus facile de lutter contre les porcs), ~pourrait être plus pratique.


Ailleurs, en Python, par exemple, ~et $HOMEdoivent être étendus par différentes fonctions . Certains autres endroits autorisent les variables et n'autorisent pas d'autres syntaxes de shell comme les caractères génériques ou l'expansion tilde (par exemple ~/.pam_environment, qui a une syntaxe spéciale pour l'expansion des variables). Pourtant, d'autres endroits autorisent l'expansion du tilde comme exception (par exemple, systemd ), mais interrogent la base de données passwd directement au lieu de l'utiliser $HOME.

homeboy
la source
Une autre grande différence, que vous montrez ici, mais ne mentionnez pas, est que vous pouvez changer la valeur de $HOME, mais vous ne pouvez pas (directement) changer la valeur de ~.
Joe
J'ai donc demandé quand faire $HOMEet ~ne pas faire référence à la même chose - ils le font normalement par défaut - et ensuite vous attribuez délibérément à la variable d'environnement pour qu'ils ne se réfèrent pas à la même chose. C'est une bonne démonstration, mais inutilement déroutante.
H2ONaCl
1

$ HOME / est plus susceptible de fonctionner dans POSIX.2 Bourne / bin / sh standard car l'extension tilde est une extension trouvée dans BSD csh tcsh GNU bash et autres.

Si vous voulez écrire des scripts portables sur busybox ou dash ou BSD sh, investissez dans les lettres supplémentaires de peur que vous ne plantiez avec ~ /: Aucun fichier ou répertoire de ce type sur certains systèmes.

Je trouve également $ HOME / plus lisible.

Czyborra Romain
la source
Dans un script, la lisibilité et la visibilité sont importantes. C'est peut-être pourquoi mes scripts utilisent $HOMEet utilisent rarement ~. Mon ancien moi le savait probablement.
H2ONaCl