我正在尝试修改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 ~/.*
看看潜在的罪犯。自从运行su
read以来/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