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

时间:2012-07-20 21:45:50

标签: linux bash centos

我一直认为$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

没有任何问题。看起来问题是波形符没有得到解决。但为什么呢?

5 个答案:

答案 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

请注意"POSIX Tilde Expansion"

中的以下内容
  

由波浪形扩展产生的路径名应被视为引用,以防止它被字段拆分和路径名扩展改变。

答案 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运行)