![对配置 Linux 路径环境 /etc/profile.d/*.sh 执行两次感到困惑?](https://linux22.com/image/153631/%E5%AF%B9%E9%85%8D%E7%BD%AE%20Linux%20%E8%B7%AF%E5%BE%84%E7%8E%AF%E5%A2%83%20%2Fetc%2Fprofile.d%2F*.sh%20%E6%89%A7%E8%A1%8C%E4%B8%A4%E6%AC%A1%E6%84%9F%E5%88%B0%E5%9B%B0%E6%83%91%EF%BC%9F.png)
我正在尝试将 PKG_CONFIG_PATH 设置为 CentOS,下面是我尝试的代码
export |grep PKG_CONFIG_PATH
没有输出,正常...
echo "$PKG_CONFIG_PATH"
:/usr/local/lib/pkgconfig
为什么这里有输出??
如果我
sudo sh -c "echo 'export PKG_CONFIG_PATH=$PKG_CONFIG_PATH :/usr/local/lib/pkgconfig' >> /etc/profile.d/path.sh
source /etc/profile.d/path.sh
现在相同的路径将出现两次......
export |grep PKG_CONFIG_PATH
declare -x PKG_CONFIG_PATH=:/usr/local/lib/pkgconfig:/usr/local/lib/pkgconfig
那么,如果路径尚未设置,$PKG_CONFIG_PATH 来自哪里?
更新编辑: 问题的第一部分实际上并不重要,因为重新启动后变量被清除
对于真正的问题,我认为这是因为 profile.d 中的文件被 /etc/bashrc 调用两次,一次被 /etc/profile 调用。有人可能会问WTH?为什么会发生这种情况?BUG?打字错误?
答案1
这就是之间的区别出口和非出口环境变量。
该export
命令仅列出导出的环境变量,即那些被子进程标记为可继承的变量,要么是因为 shell 从其父进程继承了它们,要么是因为export
ordeclare -x
命令已用于将它们标记为可导出。
非导出变量在脚本中很有用,因为您可以在脚本中使用它们,但它们不会扰乱任何子进程的环境。
要设置非导出变量,可以name=value
单独使用语法:
$ FOO=bar
$ echo $FOO
bar
export | grep FOO
$
您稍后可以将该变量标记为可导出:
...
$ export FOO
$ export | grep FOO
declare -x FOO="bar"
实际上是经典的 Bourne shell必需的您可以通过两步方式初始化环境变量:首先设置值,然后将其标记为可导出。因此,您可能仍然会在旨在实现最大可移植性的 shell 脚本中看到此语法:
FOO=bar
export FOO
现代 shell 允许一步完成:
$ export FOO=bar
因此,就您的情况而言,您之前必须PKG_CONFIG_PATH=:/usr/local/lib/pkgconfig
手动执行过 a ,或者在来源脚本,或作为登录脚本的一部分。
答案2
现在我有两个解决方案:
从 /etc/bashrc 中删除这些代码
for i in /etc/profile.d/*.sh; do if [ -r "$i" ]; then if [ "$PS1" ]; then . "$i" else . "$i" >/dev/null fi fi done
问题是我不知道为什么这些代码首先需要放在这里,删除它们后可能会产生一些副作用。
只需在 /etc/profile.d/*.sh 中使用直接赋值即可
export PKG_CONFIG_PATH=:/usr/local/lib/pkgconfig
当然,这将排除任何预先存在的路径,而不是标准做法。
他们似乎都不是完美的解决方案,有更好的建议吗?
更新 :
执行①将导致在终端输入每个命令后出现此错误消息
bash: __vte_prompt_command: command not found