.bashrc为什么不自动运行?


202

我在.bashrc文件中放置了一些别名命令,以便每次我打开新的“终端”窗口时都可以加载它们。但是这不会发生。

我必须run script:在Terminal> Preferences>“ MyDefaultTheme ”> Shell prefpane中进行选择,然后添加: source .bashrc && clear以使其正常工作...

这似乎很奇怪,因为许多教程只说您只需要添加到.bashrc文件中,一切都很好。

请注意,在bash使用终端时,我不会跑进去,我更喜欢另一个(默认)终端(不知道它是什么),因为它向我展示了我一直在的位置,例如:

>>d54c6b47b:~ romeo$

代替:

>>bash$

在bash中,所有内容均应加载。

所以我的问题是,为什么我的.bashrc文件没有自动加载,我是否必须添加每次调用的选项?

另外一些教程告诉我做类似的事情:

$alias la=’ls -la >> ~/.bashrc

应该将别名写入my .bashrc,这也不起作用...

请注意,我是UNIX新手,所以请保持谦虚。



@boehj很好,它提到“未加载.bashrc”,仅此而已。
JariKeinänen2011年

好,对不起,如果我在这里感到困惑。
boehj 2011年

您可能更喜欢csh(或其他变体)。但您应该知道>>bash$可以更改:)
vol7ron 2012年

如果你想命令运行的onload,建立.profile在你的主目录
科罗布峡谷

Answers:


94

只需.profile从主目录中将其放入文件中,即可在下次启动新的Shell或运行后运行source ~/.profile

该链接清楚地说明了外壳读取和加载启动文件的顺序:http : //hayne.net/MacDev/Notes/unixFAQ.html#shellStartup


之所以接受这个,是因为它有一个解决方案(而且是两个几乎相同的职位中的第一个)。
romeovs 2011年

36
向下投票。我建议不要遵循此建议。问题是Terminal创建了登录shell,而Bash登录shell 运行登录启动脚本,而不运行~/.bashrc。但是,解决方案不是将您的.bashrc内容简单地放入登录启动文件中,因为这两个文件旨在执行不同类型的设置。相反,Bash的规范设置是在脚本中的某个适当位置(通常是最后一个)提供您的~/.bash_profile源代码~/.bashrc
克里斯·佩奇

我没有看到其他仅是放在sh文件中的相同帖子
Mark

217

去过也做过。我知道,OS X .bashrc在bash启动时不会读取文件。而是,它读取以下文件(按以下顺序):

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

另请参阅Chris Johnsen的翔实而有用的评论:

默认情况下,Terminal通过启动Shell /usr/bin/login,这使该Shell成为登录Shell。在任何平台(不只是Mac OS X的)bash中不使用.bashrc的登录外壳(仅/etc/profile与第一.bash_profile.bash_login.profile存在并读取)。这就是为什么“放入source ~/.bashrc您的.bash_profile”是标准建议的原因

通常只是把通常会放入的东西放进~/.bashrc~/.profile,到目前为止,它的运作就像是一种魅力。


37
默认情况下,Terminal通过启动Shell /usr/bin/login,这使该Shell成为登录Shell。在任何平台(不只是Mac OS X的)bash中不使用.bashrc的登录外壳(仅/etc/profile与第一.bash_profile.bash_login.profile存在并读取)。这就是为什么“放入source ~/.bashrc您的.bash_profile”是标准建议的原因。
克里斯·约翰森

5
关于“我通常只是将通常放在〜/ .bashrc中的内容放到〜/ .profile中”:为了获得最大的兼容性,我建议您遵循Chris Johnsen的建议,然后将要应用于非登录shell的所有内容放入其中。 〜/ .bashrc并将“ source〜/ .bashrc”添加到您的〜/ .bash_profile中以运行它作为登录shell。否则,它将不适用于子外壳程序,或者如果终端更改为创建非登录外壳程序,或者您曾经使用过xterm或默认情况下创建非登录外壳程序的另一个终端程序,或者您可能想使用在另一个OS上进行相同的设置。
克里斯·佩奇

4
值得一提的是,在Mac OS X上,您应该考虑让〜/ .bashrc运行/ etc / bashrc来获取全局行为。特别是,/ etc / bashrc中有代码可以在每个提示符下更新工作目录,这使Terminal可以显示代理图标,在同一目录中创建新终端,并为Resume和Window Groups恢复工作目录。
克里斯·佩奇

对我而言,从.bash_profile中获取.bashrc无效。但是从.profile采购.bashrc / .bash_profile是有效的。
肯·罗素

2
好的答案,但有点误会。我相信,在bash终端负载只有一个~/.bash_profile~/.profile~/.bash_login,从来没有所有的人。您可以通过创建3个文件来运行简单的测试。它看起来像在bash终端具有的偏好~/.bash_profile> ~/.bash_login> ~/.profile。如果它们中的任何一个存在,则跳过那些优先级较低的对象。这就是为什么有时候建议也源~/.profile~/.bash_profile
neurite

25

我把一切都成~/.bashrc,只是source ~/.bashrc在.profile文件。

由于非登录会话仅运行.bashrc,而登录会话(例如终端或iTerm)仅运行,因此这允许screen和xterm(我猜是tmux)会话继承我的环境.profile


1
这是我的方法。这样,我可以维护一个在两个系统上都可以使用的.bashrc ...,并且可以将任何Mac特定的内容或仅适用于工作的别名(例如,我使用Mac最多的别名)放在.bash_profile文件中。
迈克尔·杜兰特

2
请注意,这.profile对于多个外壳程序是通用的,并且应仅包含POSIX兼容的sh代码。如果它来源,.bashrc则可以说包含特定于Bash的代码(该.bashrc文件的存在特定于Bash)。我建议您重命名.profile为,.bash_profile因为您是以Bash特定的方式使用它的。或者,放入通用代码.profile并创建.bash_profile来源.profile.bashrc
克里斯·佩奇

19

有两种情况:

  1. 您正在使用Linux
  2. 您正在使用Mac Os X

对于两者,您都希望~/.bashrc在终端的外壳启动时从已加载或已获取的配置文件中获取资源。


LINUX

在Linux中,~/.profile启动时会自动在shell中提供源代码。因此,如果您在终端上输入cd ~; ls -A,您将在主目录(/home/usrname/)中看到所有文件和目录。您应该看到一个名为的文件.profile。这是启动终端时自动“获取”的文件。

如果要向其添加别名和函数~/.bashrc(这是我的工作),则应该(在~/.profile添加if语句的同时检查是否~/.bashrc为非空文件,然后为其提供源代码)。

要检查您是否~/.profile已经这样做,请输入nano ~/.profile。这将在文本编辑器中打开它(如果知道,可以使用gedit,如果知道如何使用,甚至可以使用vim)。您可能会得到一个空的文本文件(不应该这样),但是如果您这样做,则只需继续。如果您没有看到一条线的任何位置,上面写着source ~/.bashrc,然后某处输入以下行(把它放在一个合理的地方像在结束或开始,而不是在if语句中的中间):

if [ -s ~/.bashrc ]; then
    source ~/.bashrc;
fi

这将检查是否~/.bashrc为非空文件(带有if [ -s ~/.bashrc ]),如果是,则将其作为源。很简单 现在,您可以将任何有效的别名,函数,变量等添加到~/.bashrc


MAC OS X

默认情况下,Max OS X源~/.bash_profile。为了能够添加内容~/.bashrc(同样,这也是我在OS X中所做的事情),然后按照与Linux相同的步骤进行操作。在终端中输入cd ~; nano .bash_profile。检查是否显示一行,source ~/.bashrc如果没有,则在(if [ -s ~/.bashrc ]; then source ~/.bashrc; fi)上方添加if语句。


笔记

当if语句写的,一定要留空间基本上一切之间(例如if [ -s ~/.bashrc]; then echo "found"; fi不工作,因为没有空间beween ~/.bashrc]-解释器会认为这是一个词)。

如果您想弄清楚如何更好地检查if语句中的内容,请转到terminal并输入man \[; 从本质上讲,这使您可以使用if语句。例如,if [ -f /path/to/file ]; then echo "it's a file"; else echo "not a file"; fi检查if /path/to/file是一个文件,是否将其打印到stdout。我也经常引用此内容,以方便理解和快速参考:7.2。文件测试操作员

我希望这有帮助。我记得当我开始所有这些工作时(不久之前),我感到多么困惑。因此,祝您未来的UNIX工作顺利!


在linux上,.profile仅当您的外壳是登录外壳时.bashrc才是源,否则才是源
smac89

11

在.bash_profile中采购.profile为我做到了

echo 'source ~/.profile' >> ~/.bash_profile

1
在.bash_profile中提供.profile是一件很棒的事情,但是仅此一项并不会导致.bashrc由登录shell运行。您的.profile必须已经获取了.bashrc,如果您使用的不是bash,则可能会导致问题。大多数Mac用户永远不会,但是如果您出于某些原因这样做,请记住这一点。:)
Terry N

要扩展@TerryN所说的话:请确保.bashrc从您.bash_profile而不是从那里获取.profile.bash_profile是特定于Bash的,并且应该另两个源。
克里斯·佩吉

6

我发现在安装rvm(自动安装程序,无需手动编辑)之后,它已经~/.bash_login为自己创建了一个文件,而我以前从来没有过。

但是,这意味着~/.profile不再加载我的设置和别名!许多快捷方式消失了。我以为他们是按顺序运行的,而不仅仅是:-/

我加了

. ~/.profile 

~/.bash_login到连锁的事情如我所料。


+1,这是我遇到的情况。我发现.bash_login或.bash_profile都将阻止.profile的执行...不知道为什么bash感到需要拥有这么多相互冲突的启动文件。
RichVel

.profile在几种不同的Shell中是通用的,并且应仅包含POSIX兼容的sh代码。.bash_profile是特定于Bash的,并且可以包含特定于Bash的代码。通常,如果您使用的是Bash,则应优先使用,.bash_profile除非您小心确保启动代码中不包含任何依赖Bash的内容。创建的任何程序都.bash_login可能这样做,因为它包含特定于Bash的代码,但是.profile如果存在,则应该包含要提供源代码的代码。
克里斯·佩奇

3

把...

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

...在中~/.bashrc,然后将源代码~/.bashrc导入~/.bash_profile 安装的终端程序后无法正常工作。

但是,然后我转到菜单下拉菜单的“ 编辑”>“配置文件首选项”,“ 标题和命令”选项卡,并从该页面的“命令”部分中选择“运行命令”作为登录外壳

这样做之后,启动新终端会在我键入内容时显示所需的结果

 type rvm|head -1

即“ rvm是一个函数”。直到我进行了更改,它才这样做,这是我在此处其他答案中所述的.bash_profile.bashrc更改之后所做的唯一更改。


2

首先,我要告诉您的~/.bashrc是,该文件是在每次调用第二个Shell(例如,运行Shell脚本时)时执行的,并且~/.profile在每次登录时都会被调用。

因此,我建议您. ~/.bashrc~/.profile文件中写入命令,并且该命令将在您每次登录时执行bashrc文件。


登录时执行.profile时,它将自动执行.bashrc文件。
阿伦·拉娜2012年

因此.bashrc会在每次登录时间接执行
arun rana 2012年

1
bashrc用于非登录shell。bash_profile / bash_login / profile /用于登录shell的其他内容。这是大量争用的根源,涉及什么是和不是登录外壳程序(例如,屏幕/ tmux会话,桌面环境中的终端等)。它不一定是“第二壳”。这是shell输入的问题。
詹森·萨拉兹

3
如果您使用的不是Bash外壳,那么按照您的描述进行操作可能会导致问题。.profile适用于所有shell,而.bashrc可能包含某些其他shell无法理解的语言。而不是.profile,将您编写的内容放在.bash_profile中。(此外,首先使.bash_profile确实是“ source .profile”。)
Terry N

1

在远程服务器(Digital Ocean)Ubuntu 16.04上安装rbenv之后,我遇到了同样的问题。

它以某种方式创造~/.bash_profile~/.bashrc在OS X系统上相同。

Ubuntu开始只读~/.bash_profile,但不是~/.bashrc应该的。

所以我只是用以下方法备份了数据~/.bash_profile

mv ~/.bash_profile ~/.bash_profile.bak

并将其重命名~/.bashrc~/.bash_profile

mv ~/.bashrc ~/.bash_profile

它为我工作。在ssh登录后,我已经加载了所有内容~/.bashrc


0

万一这可能对其他人有帮助...

确保.bashrc为正确的用户编辑正确的文件。我在使用Vagrant时遇到了类似的问题。运行后,vagrant ssh我的.bashrc文件未运行。解决方案很简单,因为我以为vagrant正在使用名为vagrant的用户登录,而我实际上是以另一个用户身份登录。所以我在编辑错误的.bashrc文件。编辑正确的.bashrc文件后,我的别名被识别。



-2

为了保持OSX样式的登录.profile并支持正常的bash行为.bashrc.bashrc如果您在常规nix和OSX之间切换,可以通过提供指向.bashrc文件的符号链接来使用该文件,该文件名为.bash_profile。只需在尝试此操作之前确保该文件尚不存在,但这就是我的方法。

ln -s .bashrc .bash_profile

通过在2个不同的shell初始化脚本之间进行此链接,您失去了必要的功能分离。一天或另一天,您将需要在会话级别(.bash_profile)进行初始化,并在每个Shell级别(.bashrc)进行不同的初始化。
2014年

-2

/ etc / bashrc用于Mac系统上的全局配置文件。您可以在此文件的顶部添加别名:ls =“ ls -G”,这样,您好了,每个人在系统上都有彩色的文件和文件夹,因此您不必为每个用户设置任何额外的内容。您还将注意到从自己开始扎根的“ sudo su-”,您仍然将拥有彩色文件和文件夹,而不会感到头疼。

另一个有趣的提示:使用Mac的Iterm2时,导入颜色配置文件将在设置了“ / etc / 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.