linux bash centos

linux - Diferencia entre $ HOME y ''~''(tilde)?



rhel bash completion (4)

El intérprete de comandos reemplaza ~ con el directorio de inicio del usuario ( actualización : o tal vez por el directorio de inicio de otro usuario, si ~ es seguido por algo que no sea a / ), pero solo si es el primer carácter de una palabra.

--with-libmemcached=~ tiene ~ al principio, por lo que el shell lo deja solo.

Siempre pensé que $HOME y ~ eran exactamente lo mismo y, por lo tanto, podrían usarse indistintamente. Hoy, cuando traté de instalar pylibmc , un enlace de python a memcached, en mi servidor compartido, el uso de ~ me dio un error pero no $HOME . Me gustaría razonar por qué.

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

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

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 , la secuencia de comandos 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é?


La principal diferencia es:

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

Entonces, shell expande el ~ solo en algunas situaciones. En su caso, el script de python simple tiene ~ dentro del script - no el valor expandido.


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


~ se expande SÓLO si es el primer carácter de una palabra Y no está citado

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

~username se expande al HOME del username de username .

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

Para citar nombres de archivo, debe usar $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

Tenga en cuenta lo siguiente de "POSIX Tilde Expansion"

La ruta de acceso resultante de la expansión de tilde se tratará como si se cita para evitar que se altere por división de campo y expansión de nombre de ruta.