/ etc / profile没有来源


45

对于11.04,我重新安装了系统。该安装的一部分是安装RVM,它坚持一个rvm.sh/etc/profile.d/。这不起作用/etc/profile(因为未加载(将每个+ r加载到中/etc/profile.d/*.sh)。根据文档,仅在登录时运行bash时才提供配置文件。为了验证这一点,我调用了bash --login,之后rvm可用。

在没有任何配置的Ubuntu早期版本中,这对我有用。也就是说,全新安装的10.10将正确地获取profile / .d。

我的问题是:我做错了什么吗?或者Natty是否做出了一些新的假设来打破这一点?我当前的解决方法是source /etc/profilein ~/.bashrc(这很糟糕,因为配置文件是 bashrc 之前加载的,但是可以解决问题)。

Answers:


52

默认情况下,gnome-terminal不会将bash作为登录shell启动(我假设您是说bash在gnome-terminal内部启动)。这意味着bash不会读取/etc/profile~/.profile。正如您已经正确观察到的那样,如果bash作为登录shell启动,它将读取这些文件。

解决您的问题的快速方法是将gnome-terminal配置为将bash作为登录shell启动,这样它将显示为/etc/profile。为此,必须在可从“编辑”菜单访问的gnome终端“配置文件首选项”中启用“作为登录外壳运行命令”。

我不建议这样做,因为这会弄乱~/.profile和之间的区别~/.bashrc。理想情况下,~/.profile应该在登录期间只执行一次所需的操作,而~/.bashrc每次bash启动时都应该执行所需的操作。

在超级用户那里有一个关于bashrc和profile之间的区别的问答。在此处阅读更多信息。

从问题描述来看,似乎在登录期间仅需加载一次rvm脚本。据我所知,Ubuntu已将图形登录配置为read /etc/profile/~/.profile。这意味着,注销并登录一次后,rvm脚本应处于活动状态。如果仍然不起作用,则可能需要为每个bash会话加载rvm脚本。如果是这种情况,那么bashrc更适合放置脚本。


设置“运行命令作为登录外壳”确实可以加载/etc/profile(因此也可以加载.d)。感谢您的解释-看来这需要跟rvm人员进行跟进。
马克

7
Ubuntu 11.04似乎没有读取,/etc/profile并且~/.profile在登录期间。很奇怪,因为它总是与旧版本一起使用。我认为这不是解决方案,而是解决方法。

2
@lesmana有什么方法可以从CLI而不是GUI启用“作为登录shell运行命令”吗?我被丢进远程服务器,无法在本地转发X。
Waseem

5

但是,有一个文件/etc/bash.bashrc 由gnome-terminal读取,并且是“用于交互式bash(1)shell的系统范围的.bashrc文件”。

我对rvm函数的调用[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"进入了那里,并且对于该系统上的几个用户来说效果很好。


gnome-terminal不执行任何操作。gnome-terminal以交互方式运行bash(或在passwd数据库中将您的登录shell设置为任何内容),并且bash开始以交互方式读取/etc/bash.bashrc。好吧,至少在Debian / Ubuntu上。Bash通常不读取系统范围的bashrc;debian已对此进行了修补。
盖尔哈2012年

@geirha:dmitri @ Eos:〜$ uname -a Linux Eos 3.0.0-16-generic#29-Ubuntu SMP Tue Feb 14 12:48:51 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux dmitri @ Eos:〜$ cat / etc / bash.bashrc#交互式bash(1)shell的系统范围.bashrc文件。#要同时在此文件中为登录Shell启用设置/命令,#此文件必须来自/ etc / profile。#如果不是交互式运行,则不要执行任何操作[-z“ $ PS1”] &&返回.....
Dmitri 2012年

2
是的,显然,gnome-terminal调用bash来读取该文件:如果您的shell是ksh,那么gnome-terminal不会读取该文件,对吗?在继续使用诸如“什么都不做”之类的挑衅性短语之前,我建议在词典中查找“ pedant”一词。
德米特里(Dmitri)2012年

4

以多用户身份安装RVM要求用户运行以下命令:

(因为Ubuntu在登录时未提供/etc/profile.d的信息)

echo '[[ -s "/etc/profile.d/rvm.sh" ]] && . "/etc/profile.d/rvm.sh" # Load RVM function' >> ~/.bashrc

3
Ubuntu确实会/etc/profile.d/在登录期间提供中的文件,因为默认情况下会/etc/profile循环遍历并提供中的文件/etc/profile.d/。但是,如果rvm.sh其中包含用于交互式shell的代码(例如函数或别名),则将它们作为来源/etc/profile是毫无意义的。交互式bash会话的设置必须位于中.bashrc
盖尔哈2012年


0

我确实为那些不喜欢完全重启机器的人找到了,除非绝对需要以下内容...

您无需重新启动整个计算机即可使更改/etc/profile生效。您所需要做的就是重新启动XWindows Desktop GUI,以便它重新读取配置(就像在系统级重新启动过程中启动它一样)。

对我来说,我使用xUbuntu,它使用LightDM,但您可以将其称为当前桌面中的任何可执行文件。

首先,您不能使用桌面GUI本身内部的终端仿真器来执行此操作(至少不使用LightDM),您需要使用SSH或辅助控制台(如果您按住Ctrl + Alt并按F键或数字键您应该从图形化桌面登录名或屏幕上移到一个普通的终端窗口)。我还建议您关闭所有远程桌面设备,例如VNC(如果您使用的是SSH)(显然SSH可以连接,只是不想打开的VNC窗口在尝试重新启动时轮询显示0,因为这可能会挂起重新启动过程,它会等待您终止VNC会话)。

我一直使用SSH来执行此操作,这是一个很大的救星,尤其是当您不亲自使用计算机并且不想等待完全重启并重新连接时:-D

现在,简单的部分出现在“辅助”终端或SSH问题中:(是的,这将终止 当前会话,请确保您不介意保存任何打开的文档或工作)

sudo service lightdm restart

等待一分钟,因为它会杀死桌面,然后再次启动它(这可能需要花好几秒钟的时间,因为事情已经停止,然后在启动时再次执行)

就是这样,现在当您回到控制台0或转到使用VNC再次连接时,登录提示符将招呼您,并像往常一样登录,如果您打开终端仿真器并发出命令,则现在应该完全没有问题,因为一切都已重新获得资源,就像重新启动了整个计算机一样。

只要记住,如果您发出sudo service lightdm restart[或stopstart,无论]从使用终端仿真器命令将只是挂在那里并没有什么桌面环境本身内将似乎发生。这是因为您当前正在使用该控制台(也称为显示)0,因此它无法完全关闭并重新启动,因为它在等待桌面不运行之前正在运行该命令。

最后注:我没有尝试在终端仿真器中从桌面上在环境中发出重新启动,然后切换到另一个控制台,然后可以重新启动它,但是如果您已经要切换控制台,那为什么不只运行命令从那里应该反正?


-4

回声“ .profile” >>〜/ .bashrc

然后打开另一个窗口。我认为这是简单的方法。


1
由于是默认.profile来源.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.