Différence entre $ HOME et ‘~’ (tilde)?

J’ai toujours pensé que $HOME et ~ étaient exactement les mêmes et pouvaient donc être utilisés indifféremment. Aujourd’hui, lorsque j’ai essayé d’installer pylibmc , une liaison python à memcached, sur mon serveur partagé, l’utilisation de ~ m’a donné une erreur mais pas $HOME . Je voudrais expliquer pourquoi.

libmemcached est une exigence pour pylibmc . J’ai libmemcached installé sous mon répertoire personnel car je n’ai pas de racine sur le serveur. Par conséquent, pour installer pylibmc , je dois m’assurer que le script d’installation sait où trouver libmemcached .

Lors de l’exécution de python setup.py install --with-libmemcached=~ , le script d’installation s’exécute

 gcc -pthread -fno-ssortingct-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall \
   -Wssortingct-prototypes -fPIC -DUSE_ZLIB -I ~ / include \
   -I / usr / local / include / python2.7 -c _pylibmcmodule.c \
   -o build / temp.linux-i686-2.7 / _pylibmcmodule.o -fno-ssortingct-aliasing

ce qui donne les erreurs que libmemcached ne peut pas trouver.

Si je passe à --with-libmemcached=$HOME , le script s’exécute

 gcc -pthread -fno-ssortingct-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall \
   -Wssortingct-prototypes -fPIC -DUSE_ZLIB -I / home / waterbotte / include \
   -I / usr / local / include / python2.7 -c _pylibmcmodule.c \
   -o build / temp.linux-i686-2.7 / _pylibmcmodule.o -fno-ssortingct-aliasing

sans aucun probléme. Il semble que le problème soit que tilde ne soit pas résolu. Mais pourquoi?

Le shell remplace ~ par le répertoire personnel de l’utilisateur ( update : ou peut-être par le répertoire personnel d’un autre utilisateur, si ~ est suivi par autre chose que a / ), mais uniquement s’il s’agit du premier caractère d’un mot.

--with-libmemcached=~ n’a pas ~ au début, donc le shell le laisse seul.

Le tilde fait partie d’une extension de shell (comme en bash, csh, zsh, etc.). La variable $HOME est exportable et peut être utilisée indépendamment d’un shell spécifique.

~ est élargi UNIQUEMENT s’il s’agit du premier caractère d’un mot ET il est non cité

 $ echo "~" ~ $ echo foo~ foo~ $ echo ~ /home/guest $ echo ~/foo /home/guest/foo 

~username est étendu à la HOME du username .

 $ echo ~root /root $ echo ~invaliduser ~invaliduser 

Pour citer des noms de fichiers, vous devez utiliser $HOME ou citer le suffixe

 $ echo "$HOME/foo bar" /home/guest/foo bar $ echo ~/"foo bar" /home/guest/foo bar $ echo ~root/"foo bar" /root/foo bar 

Notez ce qui suit de “POSIX Tilde Expansion”

Le nom de chemin résultant de l’extension tilde doit être traité comme s’il était cité pour éviter qu’il ne soit altéré par le fractionnement de champs et l’extension de chemin.

La principale différence est:

 cd /tmp ls "$HOME" #works ls "~" #nope 

Donc, shell développer le ~ que dans quelques situations. Dans votre cas, le script python simple a obtenu ~ dans le script – pas la valeur expulsée.