【问题标题】:Unix env path variable with wave sign带有波形符号的 Unix env 路径变量
【发布时间】:2018-05-13 15:32:28
【问题描述】:

在我的 Ubuntu 16.04.4 LTS xenial 上,我想声明环境变量,其中包含我的 ~/.virtualenvs 文件夹的路径。

我想要什么

拥有一个系统范围的环境字符串变量,我可以在我的 unix 命令中使用它,例如 cd $MYVAR 或类似的优雅用法。

我尝试了什么:

我在/etc/environment 文件中添加了以下行,然后重新启动了服务器:

$PATH_VENV="~/.virtualenvs"

问题:

当我尝试在 unix 命令中使用我新声明的变量时,这是一个输出:

cd ${PATH_VENV}
-bash: cd: ~/.virtualenvs: No such file or directory

我认为 UNIX 将~/.virtualenvs 直接解释为文件夹的名称,而不是将~ 解释为主文件夹。如何解决这个问题?有什么解决办法吗?

奇怪的提示:

我检查了我的$PATH_VENV 变量,如下所示,发现有一个额外的换行符,但我不知道为什么:

echo $PATH_VENV | od -a
0000000   ~   /   .   v   i   r   t   u   a   l   e   n   v   s  nl
0000017

【问题讨论】:

  • 试试$PATH_VENV=~/.virtualenvs。没有引号
  • 最近也试过了。结果与引号相同。

标签: unix path environment-variables


【解决方案1】:

首先,您的 /etc/environment 文件不应在 var 名称前包含美元符号。其次,像 bash 这样的 POSIX 1003 shell 在参数扩展之前执行波浪号扩展。如果您键入man bash,请阅读名为EXPANSION 的部分。问题是 /etc/environment 被不执行波浪号扩展的 pam_env 模块读取(至少在 Linux 上)。如果您运行env | grep PATH_VENV,您将看到波浪号没有被您的主目录替换。并且因为 POSIX 1003 shell 在变量扩展之前执行波浪号扩展,您最终会执行与 cd '~/.virtualenvs' 等效的操作(注意路径周围的引号)。

答案是不要在/etc/environment 中设置这个变量。在你的 ~/.profile~/.bashrc 中设置它。

P.S.,“附加换行符”是因为您使用了 echo,默认情况下,它会在它回显的字符串中附加一个换行符。

P.P.S.,您所说的“波浪”符号通常称为“波浪”字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2019-08-16
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多