对配置 Linux 路径环境 /etc/profile.d/*.sh 执行两次感到困惑?

对配置 Linux 路径环境 /etc/profile.d/*.sh 执行两次感到困惑?

我正在尝试将 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 从其父进程继承了它们,要么是因为exportordeclare -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

现在我有两个解决方案:

  1. 从 /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
    

    问题是我不知道为什么这些代码首先需要放在这里,删除它们后可能会产生一些副作用。

  2. 只需在 /etc/profile.d/*.sh 中使用直接赋值即可

    export PKG_CONFIG_PATH=:/usr/local/lib/pkgconfig
    

    当然,这将排除任何预先存在的路径,而不是标准做法。

他们似乎都不是完美的解决方案,有更好的建议吗?

更新 :

执行①将导致在终端输入每个命令后出现此错误消息

 bash: __vte_prompt_command: command not found

相关内容