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

tam*_*are 60 linux bash centos

我一直认为$HOME并且~完全相同,因此可以互换使用.今天,当我尝试安装pylibmc,一个python绑定到memcached,在我的共享服务器上使用时~给了我错误但没有 $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

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

Jon*_*Lin 44

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


n. *_* m. 33

shell替换~为用户的主目录(更新:或者可能是某个其他用户的主目录,如果~后面跟着a之外的其他用户/),但只有它是单词的第一个字符.

--with-libmemcached=~~没有开始,所以外壳离开单干.

  • stromberg@aw50 ~ $ echo abc~def abc~def stromberg@aw50 ~ $ echo ~def ~def stromberg@aw50 ~ $ echo def~ def~ stromberg@aw50 ~ $ echo abc${HOME}def abc/home/strombergdef stromberg @aw50 ~ $ echo ${HOME}def /home/strombergdef stromberg@aw50 ~ $ echo def${HOME} def/home/stromberg stromberg@aw50 ~ $ (2认同)

go2*_*ull 25

~ 仅当它是单词的第一个字符并且它是未加引号时才展开

$ echo "~"
~
$ echo foo~
foo~
$ echo ~
/home/guest
$ echo ~/foo
/home/guest/foo
Run Code Online (Sandbox Code Playgroud)

~username被扩展到HOMEusername.

$ echo ~root
/root
$ echo ~invaliduser
~invaliduser
Run Code Online (Sandbox Code Playgroud)

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

$ echo "$HOME/foo bar"
/home/guest/foo bar
$ echo ~/"foo bar"
/home/guest/foo bar
$ echo ~root/"foo bar"
/root/foo bar
Run Code Online (Sandbox Code Playgroud)

请注意以下"POSIX Tilde扩展"

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


jm6*_*666 9

主要区别是:

cd /tmp
ls "$HOME" #works
ls "~" #nope
Run Code Online (Sandbox Code Playgroud)

因此,shell只在少数情况下扩展〜.在你的情况下,python脚本简单地得到了脚本 - 而不是expaded值.