$ HOME和“〜”(代字号)之间的区别?

我一直认为$HOME~是完全一样的,因此可以互换使用。 今天,当我试图安装pylibmc ,一个Python绑定到memcached,在我的共享服务器上使用~给了我错误,但不是$HOME 。 我想解释一下为什么。

libmemcachedpylibmc的一个要求。 我有libmemcached安装在我的主目录下,因为我在服务器上没有根。 因此,要安装pylibmc ,我需要确保安装脚本知道在哪里findlibmemcached

当执行python setup.py install --with-libmemcached=~ ,安装脚本运行

 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

这给出了libmemcached无法find的错误。

如果我更改为--with-libmemcached=$HOME ,脚本运行

 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

没有任何问题。 看起来问题是代字号不能解决。 但为什么?

shellreplace用户的主目录( 更新 :或者其他用户的主目录,如果后面跟着一个/以外的内容),但是只有当它是单词的第一个字符时。

--with-libmemcached=~在开头没有,所以shell保持独立。

代字号是shell扩展的一部分(如bash,csh,zsh等)。 $HOMEvariables是可导出的,可以独立于特定的shell使用。

~只在它是单词的第一个字符时才被扩展,并且不加引号

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

~username被扩展到~usernameHOME

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

要引用文件名,您应该使用$HOME或引用后缀

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

请注意以下“POSIX Tilde扩展”

由代字符扩展产生的path名应被视为引用,以防止由于字段拆分和path名扩展而被改变。

主要区别是:

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

所以,shell只在less数情况下扩展。 在你的情况下,python脚本简单的〜在​​脚本里面 – 而不是扩展的值。