【问题标题】:Difference between $HOME and '~' (tilde)?$HOME 和'~'(波浪号)之间的区别?
【发布时间】:2012-07-20 04:50:57
【问题描述】:

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

libmemcachedpylibmc 的要求。我已经安装了 libmemcached 在我的主目录下,因为我在服务器上没有根。结果,到 安装 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

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

【问题讨论】:

  • 我认为波浪号是一种命令行便利。在脚本中,应始终使用$HOME

标签: linux bash centos


【解决方案1】:

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

【讨论】:

  • 是不是表示波浪号依赖于shell?
  • @Nikhil 在技术上确实如此,但我不知道有任何 shell 不像所有其他 shell 那样使用波浪号
【解决方案2】:

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

--with-libmemcached=~ 开头没有 ~,所以 shell 不理会它。

【讨论】:

  • 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 ~ $
  • @user1277476:这很难阅读。请查看更新。
  • 值得学习的有趣事实。正是我正在寻找的。谢谢n.m.
  • @user1277476 echo 是一个内置的shell 命令,shell 知道你是否想要echo 的东西,参数不是指一个文件,因为~ 是一个内置的shell扩展,shell 知道得更好,不会用你的主目录替换它。
  • 值得一提的是,波浪号扩展不止于此。请参阅Tilde Expansion 上的 bash 手册。例如,波浪号在用于变量赋值时会被扩展(例如SOME=~),即使它不是单词的第一个字符。
【解决方案3】:

主要区别在于:

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

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

【讨论】:

    【解决方案4】:

    ~ 仅在它是单词的第一个字符且未加引号时才被扩展

    $ 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"的以下内容

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

    【讨论】:

      【解决方案5】:

      运行以下脚本:

      #!/bin/bash
      
      sudo -H -u root bash<<EOF
      echo $HOME
      echo ~
      EOF
      

      输出:

      /home/my_current_user
      /root
      

      您可以看到~ 稍后由目标shell(由root 运行)得到expanded,而$HOME 由源shell(由my_current_user 运行)得到substituted

      【讨论】:

        猜你喜欢
        • 2015-11-25
        • 2015-04-03
        • 1970-01-01
        • 2021-11-15
        相关资源
        最近更新 更多