81

我一直认为$HOME并且~完全相同,因此可以互换使用。今天,当我尝试在我的共享服务器上安装pylibmc~ (一个绑定到 memcached 的 python 绑定)时,使用给了我错误但没有 $HOME。我想说明原因。

libmemcachedpylibmc的要求。我在我的主目录下安装了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

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

4

5 回答 5

56

波浪号是shell 扩展的一部分(如 bash、csh、zsh 等)。该$HOME变量是可导出的,并且可以独立于特定的 shell 使用。

于 2012-07-20T21:49:34.003 回答
40

shell 替换~为用户的主目录(update : 或者可能是其他用户的主目录,如果~后面跟着 a 以外的内容/),但前提是它是单词的第一个字符。

--with-libmemcached=~一开始还~没有,所以壳不管它。

于 2012-07-20T21:52:27.247 回答
39

~仅当它是单词的第一个字符并且未引用时才被扩展

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

~username扩展到HOMEusername

$ 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 波浪号扩展”中的以下内容

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

于 2015-06-04T16:17:57.333 回答
11

主要区别在于:

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

因此,shell 仅在少数情况下扩展 ~。在您的情况下,python 脚本简单地得到了 ~ 在脚本中 - 而不是扩展值。

于 2012-07-20T22:12:03.753 回答
2

运行以下脚本:

#!/bin/bash

sudo -H -u root bash<<EOF
echo $HOME
echo ~
EOF

输出:

/home/my_current_user
/root

您可以看到它~在稍后被目标 shell (run by )扩展,而被源 shell (run by )替换root$HOMEmy_current_user

于 2019-07-15T02:37:08.723 回答