2012-07-20 14 views
45

Siempre he pensado que $HOME y ~ son exactamente iguales y, por lo tanto, podrían usarse de manera intercambiable. Hoy, cuando intenté instalar pylibmc, un pitón vinculando a memcached, en mi servidor compartido el uso de ~ me dio error pero no $HOME. Me gustaría razonar por qué.

libmemcached es un requisito para pylibmc. Tengo libmemcached instalado en mi directorio principal porque no tengo una raíz en el servidor. Como resultado, para instalar pylibmc, necesito asegurarme de que el script de instalación sabe dónde encontrar libmemcached.

Al ejecutar python setup.py install --with-libmemcached=~, el script de instalación se ejecuta

 
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall \ 
    -Wstrict-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-strict-aliasing 

que da los errores que libmemcached no se puede encontrar.

Si cambio a --with-libmemcached=$HOME, el script se ejecuta

 
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall \ 
    -Wstrict-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-strict-aliasing 

sin ningún problema. Parece que el problema es que tilde no se resuelve. ¿Pero por qué?

+5

Considero que tilde es una conveniencia de línea de comandos. En las secuencias de comandos, '$ HOME' siempre se debe usar en su lugar. –

Respuesta

27

La cáscara reemplaza ~ con el directorio personal del usuario (actualización: o tal vez por el directorio principal de algún otro usuario, si ~ es seguido por algo más que un /), pero sólo si es el primer carácter de una palabra.

--with-libmemcached=~ tiene ~ no al principio, por lo que la carcasa lo deja solo.

+2

Stromberg @ AW50 ~ $ echo abc ~ def ABC ~ DEF Stromberg @ AW50 ~ $ echo ~ def ~ def Stromberg @ AW50 ~ $ echo def ~ def ~ Stromberg @ AW50 ~ $ echo abc $ {HOME} def abc/home/strombergdef Stromberg @ AW50 ~ $ echo $ {HOME} def /home/strombergdef Stromberg @ AW50 ~ $ echo def $ {HOME} DEF/home/Stromberg Stromberg @ AW50 ~ $ – user1277476

+0

@ user1277476: Esto es muy difícil de leer. Por favor mira la actualización. –

+0

hecho interesante de aprender. Exactamente lo que estoy buscando. Gracias n.m. – tamakisquare

33

La tilde es parte de un shell expansion (como en bash, csh, zsh, etc.). La variable $HOME es exportable y se puede usar independientemente de un shell específico.

8

La diferencia principal es:

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

Así, expanda la cáscara ~ sólo en algunas situaciones. En su caso, el script de python simple tiene ~ dentro del script - no el valor expandido.

15

~ se expande sólo si es el primer carácter de una palabra y es sin comillas

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

~username se expande a la HOME del username.

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

Para citar los nombres de archivo, debe utilizar $HOME o citar el sufijo

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

Observe lo siguiente en "POSIX Tilde Expansion"

La ruta resultante de la expansión de tilde será tratada como si se citara a evitar que sea alterado por división de campo y expansión de nombre de ruta.