在CentOS中将目录添加到$ PATH?


84

我们刚刚启动了新服务器,并且所有服务器都在运行CentOS。成功安装Ruby Enterprise Edition之后,我现在想添加REE / bin(位于/usr/lib/ruby-enterprise/bin)目录,使其成为服务器上的默认Ruby解释器。

我尝试了以下操作,仅将其添加到当前的shell会话中:

export PATH=/usr/lib/ruby-enterprise/bin:$PATH

什么是正确的做法,以永久此目录$ PATH增加对所有用户。我目前以root用户身份登录。

提前致谢!

Answers:


115

进行这样的编辑不是一个好主意/etc/profile,因为每当CentOS为该文件发布更新时,您将丢失所有更改。这正是/etc/profile.d用于:

# echo 'pathmunge /usr/lib/ruby-enterprise/bin' > /etc/profile.d/ree.sh
# chmod +x /etc/profile.d/ree.sh

重新登录并享受(安全)更新的PATH:

# echo $PATH
/usr/lib/ruby-enterprise/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# which ruby
/usr/lib/ruby-enterprise/bin/ruby

除了重新登录,您可以重新加载配置文件:

# . /etc/profile

这将更新$PATH变量。


1
~/.profile也是另一个有效的选项
Zypher

4
是的,对于单个用户。但是问题是关于为所有用户更改PATH 。
迈克,

2
@Mike这个pathmunge命令是什么?
Nickolai Leschov

@NickolaiLeschov我很确定它只是将路径附加到$ PATH。
迈克

@NickolaiLeschov它是在/ etc / profile中定义的函数
CrazyPheel

11

在听了fmonk的建议之后,我检出了/etc/bashrc,发现它说“环境信息放在/ etc / profile中。” 我继续往里看/etc/profile,我看到了:

pathmunge () {
    if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
       if [ "$2" = "after" ] ; then
          PATH=$PATH:$1
       else
          PATH=$1:$PATH
       fi
    fi
}

[...]

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
fi

为了解决我的问题,我只是pathmunge /usr/lib/ruby-enterprise/bin在if语句下添加了内容。这解决了我的问题。


有人可以解释"$EUID" = "0"在这种情况下意味着什么吗?
伊莱(Eli)

EUID 0表示用户为root。
bbaja42 2011年

6
您应该已经使用过/etc/profile.d。请参阅下面的答案。
麦克,

请考虑接受@MikeConigliaro答案作为正确答案。他的方法是正确的。它就是以这种方式工作的。查看文件/etc/profile.d/夹中的文件,您会发现它。而且,正如他所说,系统更新可能会撤消您的解决方案。
Caio Cunha 2012年

4

“交互式登录外壳程序是在成功登录后使用/ bin / login通过读取/ etc / passwd文件启动的。此外壳程序调用通常在启动时读取/ etc / profile及其等效的〜/ .bash_profile。

交互式非登录外壳程序通常使用外壳程序(例如[prompt] $ / bin / bash)在命令行中启动,或通过/ bin / su命令启动。交互式非登录外壳程序还可以从图形环境中的终端程序(例如xterm或konsole)启动。这种类型的Shell调用通常会复制父环境,然后读取用户的〜/ .bashrc文件以获取其他启动配置说明。” http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html

因此,我不会将环境变量放在bashrc中,因为它不仅违反通用约定,而且从图形桌面环境中调用终端时,您还会错过bashrc变量。

在Redhat中,/etc/profile我发现此评论:

“系统范围内的别名和功能应该放在/ etc / bashrc中。个人环境变量和启动程序应该放在〜/ .bash_profile中。个人别名和功能应该放在〜/ .bashrc中。”

因此,如果要基于用户设置环境变量,请在用户的.bash_profile文件中进行设置。

前往.bash_profile我读到的内容:

“个人环境变量和启动程序。

个人别名和功能应放在〜/ .bashrc中。系统范围的环境变量和启动程序位于/ etc / profile中。系统范围的别名和功能在/ etc / bashrc中。”

结论
如果只希望root用户查看驻留的程序,例如,在/中sbin,则将该路径添加到root用户的.bash_profile文件中。但是,如果你希望每个用户看到安装在你的盒子,我会把根什么具体方案/sbin进入/etc/.profile。现在,每个用户都可以使用制表符完成功能来查找根目录特定的程序,并在必要时提升权限。

特殊情况:SSH
使用命令行启动ssh时,将启动交互式登录shell。但是在这种情况下/etc/profile不读。当我在.bash_profile每个用户的文件中定义环境变量时,它与ssh一起使用。


2

抱歉,以下询问是针对用户个人资料的错误解释,请假使它有助于他人

修改.bash_profile

nano ~/.bash_profile

然后在文件中的某处添加/修改路径分隔符:

 PATH=$PATH:$HOME/bin:/your/path
 export PATH

然后重新加载您的个人资料

source ~/.bash_profile

或注销并再次登录

如果检查PATH,则其中应包括新添加的路径

echo $PATH

1

您可以在.rc文件中设置环境变量。对于bash shell(我相信这是CentOS中最常见的默认设置),每个用户的主目录中都有一个名为.bashrc的文件。

将命令PATH = / usr / lib / ruby​​-enterprise / bin:$ PATH添加到此文件以为任何一个特定用户设置它。

要为所有用户设置该文件(如您所述),请在/ etc / bashrc中对其进行更改(每个用户主目录中的默认.bashrc文件都将源此文件,但您应仔细检查该文件)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.