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.