$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?
$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?
Réponses:
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.~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.
~développe en $HOME(égal à $HOMEPATH), non $APPDATA. Et sur cmd.exe, ~ne se développe pas.
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).
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
~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.
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.
$HOME, mais vous ne pouvez pas (directement) changer la valeur de ~.
$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.
$ 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.
$HOMEet utilisent rarement ~. Mon ancien moi le savait probablement.
~dépend du shell tandis que $ HOME ne l'est pas.