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.