10 votes

Y a-t-il une différence entre ~ et $HOME ?

Il semblerait que ~ et $HOME soient équivalents en ligne de commande et dans les scripts du shell. Est-ce bien le cas ?

14voto

techraf Points 3610

C'est vrai dans une certaine mesure.

  • $HOME est une expression pour l'expansion de la variable d'environnement HOME
  • ~ (tilde) est un composant séparé d'expansion du shell voir note de bas de page

Lorsqu'elle est utilisée comme argument de commande et qu'elle est séparée des autres chaînes de caractères, $HOME y ~ sont généralement équivalentes.

Mais il y a des cas où ils diffèrent :

  • si la chaîne contenant l'un ou l'autre est citée, par exemple :

    # echo "My home directory is $HOME"
    My home directory is /Users/techraf
    # echo "My home directory is ~"
    My home directory is ~
  • s'ils sont concaténés à une chaîne de caractères, par exemple :

    • dd if=${HOME}/source_file of=${HOME}/destination_file fonctionnera.

      Le shell passera des arguments if=/Users/techraf/source_file y of=/Users/techraf/destination_file contenant un chemin d'accès valide au dd commandement.

    • dd if=~/source_file of=~/destination_file ne fonctionne pas

      Le shell passera des arguments if=~/source_file y of=~/destination_file à la dd et il signalera une erreur car il n'interprète pas la commande ~ .


note de bas de page :

En effet ~ est par défaut remplacé par la valeur de HOME mais si HOME est vide, il est résolu en un répertoire personnel :

# echo $HOME
/Users/techraf
# export HOME=/dummy
# echo $HOME
/dummy
# echo ~
/dummy

# unset HOME
# echo $HOME

# echo ~
/Users/techraf

Desde man bash :

Tilde Expansion

Si un mot commence par un caractère tilde non cité (`~'), tous les caractères précédant la première barre oblique non citée (ou tous les caractères, s'il n'y a pas de barre oblique non citée) sont considérés comme un préfixe tilde. Si aucun des caractères du tilde-préfixe n'est cité, les caractères du tilde-préfixe qui suivent le tilde sont traités comme un nom de connexion possible. Si ce nom de connexion est une chaîne nulle, le tilde est remplacé par la valeur du paramètre shell HOME.

Si HOME n'est pas défini, le répertoire personnel de l'utilisateur qui exécute le shell est substitué. Sinon, le préfixe tilde est remplacé par le répertoire de base associé au nom de connexion spécifié.

0 votes

J'ai supprimé les commentaires, veuillez utiliser chat.stackexchange.com/rooms/38/ask-different-chat ou un chat privé pour des discussions plus approfondies.

0 votes

En passant, si vous unset HOME dans d'autres coquilles, telles que ksh, zsh, or dash puis echo ~ ne s'étendra pas au chemin de votre dossier personnel.

0 votes

@fd0 ksh Le comportement semble étrange - il ne résout que le nom d'utilisateur lorsqu'il n'y a pas de nom d'utilisateur. HOME est défini.

0voto

Aaron N. Tubbs Points 1019

$HOME est disponible sur les débuts de connexion lorsque ~ n'est pas disponible. La raison en est que $HOME est défini par l'environnement du système, et ~ est un raccourci du shell. C'est pourquoi $HOME est préférable pour les scripts shell.

3 votes

Pourriez-vous expliquer plus en détail à quel moment le shell résout la variable d'environnement en utilisant l'expansion des paramètres ( $parameter ) syntaxe (citation : " connexion aux premières étapes ", de sorte que c'est " de préférence pour les scripts shell "), mais pas encore ~ ?

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X