使用导出 PATH CentOS 奇怪的行为

使用导出 PATH CentOS 奇怪的行为

我正在尝试修改PATH位于以下位置的两个不同脚本中的变量/etc/profile.d/

  • /etc/profile.d/php.sh

    #!/bin/sh
    PATH=$PATH:/usr/local/php/bin
    export PATH
    
  • /etc/profile.d/mysql.sh

    #!/bin/sh
    PATH=$PATH:/usr/local/mysql/bin
    export PATH
    

重新启动CentOS并检查PATH变量(已编辑),$PATH被修改了两次!

[]$ echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:
/usr/local/mysql/bin:/usr/local/php/bin:/home/IntUser/bin:/usr/local/mysql/bin:
/usr/local/php/bin
[]$ 

在 root 模式下:

[]$ su
Password: 
[]# 

$PATH被修改了3次!

[]# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:
/usr/local/mysql/bin:/usr/local/php/bin:/home/IntUser/bin:/usr/local/mysql/bin:
/usr/local/php/bin:/usr/local//mysql/bin:/usr/local/php/bin
[]# 

为什么不只分配一次呢?

答案1

修复方法如下:将文件/etc/profile.d/php.sh内容替换为:

pathmunge /usr/local/php/bin after

对于文件也类似/etc/profile.d/mysql.sh

pathmunge /usr/local/mysql/bin after

解释是/etc/profile.d/*.sh中的文件是来源by /etc/profile(它本身是由登录 bash shell 获取的)。

由于这些文件是有来源的,因此/etc/profile它们可以使用该文件中的任何变量和函数。pathmunge就是这样一个函数(无论如何在我的 Fedora 20 上),其唯一目的是向 中添加一个新目录PATH,但前提是该目录尚不存在。该关键字 after将新目录添加到PATH.

因此,您将不会有重复项。但是,我不知道你为什么要拥有它们。

答案2

发生这种情况是因为您的配置中的某些内容正在加载/etc/profile多次。您需要找到它并修复它。

该文件/etc/profile由登录 shell 读取。在许多平台上登录图形会话时也会读取它(但这取决于显示管理器、会话管理器以及您的发行版如何设置它们)。

一个可能的问题是您请求/etc/profile从其他位置(例如~/.bashrc.如果是这种情况,请将其删除。跑去grep -s profile ~/.*看看潜在的罪犯。自从运行suread以来/etc/profile,必须至少有一个该问题的实例,可能与.bashrc.

另一个可能的问题是,如果您在 GUI 会话中打开终端时运行登录 shell。解决方法是不要运行登录 shell——您已经登录到 GUI 会话,终端是一个普通的应用程序。

鉴于您之前出现过一次目录/home/IntUser/bin,之后又出现过一次,则/etc/profile在添加 . 的部分之后会被第二次读取/home/IntUser/bin

或者,如果您不想修复配置,则仅当该目录尚不存在时才可以将其添加到 PATH 中。

case :$PATH: in
  *:/usr/local/php/bin:*) :;;
  *) PATH=$PATH:/usr/local/php/bin;;
esac

相关内容