在我的 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
解释为文件夹的名称,而不是将~
解释为主文件夹。如何解决这个问题?有什么解决方法吗?
Wierd 提示:
我像下面这样检查了我的$PATH_VENV
变量,发现还有一个额外的换行符,但是我不知道为什么:
echo $PATH_VENV | od -a
0000000 ~ / . v i r t u a l e n v s nl
0000017
首先,你的/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/环境中设置这个变量。将其设置在您的~/.profile或~/.bashrc中。
附言,"附加换行符"是因为您使用了echo
默认情况下,它会在它回显的字符串后附加一个换行符。
P.P.S.,你所说的"波浪"符号通常被称为"波浪号"字符。