2012-07-20 55 views
45

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

libmemcachedpylibmc的要求。我有libmemcached在我的主目录下安装了 ,因为我在服务器上没有root。因此,我需要确保安装脚本知道在哪里找到libmemcached

执行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不能被发现的错误。

如果我更改为--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 

没有任何问题。看起来问题在于代字号没有得到解决。但为什么?

+5

我认为代字号是命令行的便利。在脚本中,总是应该使用'$ HOME'。 – 2012-07-20 21:52:40

回答

27

外壳替换~与用户的主目录(更新:或者是通过其他用户的主目录,如果~后跟比/其他的东西),但只有当它的第一个字符字。

--with-libmemcached=~~没有在开始,所以shell离开它。

+2

的Stromberg @ AW50〜$回声ABC〜高清 ABC〜高清 的Stromberg @ AW50〜$回声〜高清 〜高清 的Stromberg @ AW50〜$呼应高清〜 高清〜 的Stromberg @ AW50〜$回声ABC $ {HOME} DEF ABC /家庭/ strombergdef 的Stromberg @ AW50〜$回声$ {HOME}高清 /家庭/ strombergdef 的Stromberg @ AW50〜$呼应DEF $ {HOME} DEF /家庭/斯特龙伯格 的Stromberg @ AW50〜$ – user1277476 2012-07-20 22:00:42

+0

@ user1277476:这很难阅读。请参阅更新。 – 2012-07-20 22:03:30

+0

有趣的事实学习。正是我在找什么。谢谢你。 – tamakisquare 2012-07-20 22:24:49

33

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

8

的主要区别是:

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

因此,外壳〜只有在少数情况下扩大。在你的情况下,python脚本简单地在脚本内部 - 不是扩展的值。

15

~只是扩大,如果它是一个单词的第一个字符,它是不带引号的

$ 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 Expansion"

从波浪线扩展产生的路径如下仿佛报之以应被视为防止通过字段分割和路径名扩展来改变它。