我一直认为$HOME
和~
完全相同,因此可以
可互换使用。今天,当我尝试安装 pylibmc 时,一个python
绑定到memcached,在我的共享服务器上使用~
给了我错误但没有
$HOME
。我想说明原因。
libmemcached 是 pylibmc 的要求。我安装了 libmemcached 在我的主目录下,因为我在服务器上没有root。结果,到 安装 pylibmc ,我需要确保安装脚本知道在哪里 找到 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
没有任何问题。看起来问题是波形符没有得到解决。但为什么呢?
答案 0 :(得分:42)
代字号是shell expansion的一部分(如bash,csh,zsh等)。 $HOME
变量是可导出的,可以独立于特定的shell使用。
答案 1 :(得分:31)
shell将~
替换为用户的主目录(更新:或者可能由某个其他用户的主目录替换,如果~
后面跟不是/
),但前提是它是单词的第一个字符。
--with-libmemcached=~
开头没有~
,所以shell不管它。
答案 2 :(得分:23)
~
只有在单词的第一个字符并且不加引号时才会展开
$ echo "~"
~
$ echo foo~
foo~
$ echo ~
/home/guest
$ echo ~/foo
/home/guest/foo
~username
已扩展为HOME
的{{1}}。
username
引用文件名,您应该使用$ echo ~root
/root
$ echo ~invaliduser
~invaliduser
或引用后缀
$HOME
中的以下内容
由波浪形扩展产生的路径名应被视为引用,以防止它被字段拆分和路径名扩展改变。
答案 3 :(得分:8)
主要区别在于:
cd /tmp
ls "$HOME" #works
ls "~" #nope
所以,shell只在少数情况下扩展〜。在你的情况下,python脚本简单地在脚本内部 - 而不是expaded值。
答案 4 :(得分:0)
运行以下脚本:
#!/bin/bash
sudo -H -u root bash<<EOF
echo $HOME
echo ~
EOF
输出:
/home/my_current_user
/root
您可以看到~
之后由目标外壳程序(由root
运行)得到expanded,而$HOME
被源外壳程序得到substituted(由my_current_user
运行)