.bash_profile和.bashrc有什么区别?


245

要在OS X中为终端创建别名,可以将别名放入.bash_profile或中.bashrc。两者之间有什么区别,为什么我选择在其中一个而不是另一个中使用别名?


5
不要在这里劝阻UNIX知识,但是bash是纯UNIX的野兽,因此您可能会获得更好的知识,或者在合作伙伴站点上已多次回答这个问题。在有超过200 .bashrc的问题/答案对的UNIX
bmike

还有.profile文件...请参阅堆栈溢出问题
Yaakov Baruch

2
如果您brew install bash使用iTerm2,则可以设置profile -> command/usr/local/bin/bash.bashrc默认情况下将加载为.bash_profile。这也给您Bash 4个好东西...
Ray Foss

我听说.bashrc已有多年没有使用了,默认情况下将不起作用,而.bash_profile是macosx中的东西。我尝试了.bashrc和t不适用于我,但是.bash_profile起作用了
barlop

Answers:


246

.bash_profile对于登录Shell执行,而.bashrc对于交互式非登录Shell执行。

当您通过控制台登录(键入用户名和密码)时,无论是坐在计算机上还是通过ssh:远程.bash_profile执行,都会在初始命令提示符之前配置您的shell。

但是,如果您已经登录到计算机并打开一个新的终端窗口(xterm),则会.bashrc在窗口命令提示符之前执行。.bashrc当您通过输入/bin/bash终端启动新的bash实例时也会运行该命令。

在OS X上,默认情况下,Terminal每次都会运行一个登录Shell,因此与大多数其他系统有些不同,但是您可以在首选项中进行配置。


57
On OS X, Terminal by default runs a login shell every time-我一直很困惑,没有意识到这一点。好信息!
vaughan

1
@Alex,为什么OS X终端每次都会运行登录shell?
Pacerier's

17
“有些苹果开发人员最初并没有意识到其中的区别,现在将其包含在一些大型应用中。
Snowcrash

2
我在OS X上,我使用zshell代替bash,并使用iTerm代替Terminal。尽管我使用的终端和shell与答案讨论的不同,但OS X似乎仍在考虑所有登录shell,因为.zprofile每次都会运行。
亚当·泽纳

1
对于那些希望全面了解登录/非登录和交互式/非交互式外壳以及它们何时运行这些配置文件的组合的人员,请参见unix.stackexchange.com/a/46856/38715
kevinmicke,

45

X11将看着您,.bashrc而“常规”终端将看着您.bash_profile

但是,如果将以下内容添加到中.bash_profile,则可以将所有内容移动到.bashrc文件中,以便将所有内容合并到一个位置而不是两个位置:

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi

或者你可以做cd ~ ; ln -s .bashrc .bash_profile
lhf

5
这两个配置文件具有明显独立的功能。在某些情况下,有必要在会话的开始处进行初始化,并且仅在那里(~/.bash_profile)进行初始化。通常还需要在每个shell级别(~/.bashrc)定义增量代码。建议压制这种自由并不是最好的主意。
2013年

3
@danielAzuelos:Lurch省略了这一部分,但是~/.bash_profile每个新窗口/选项卡的OS X Terminal源代码,因此就Terminal而言,实际上没有办法将两者分开。
mipadi 2014年

14
@mipadi仍然可以将它们分开。例如,.bash_profile永远不能在子进程中再次获取。嵌套Bash源的每个级别.bashrc,因此,如果在中放置类似export A=a:$A的内容.bashrc,则嵌套Bash中的源$A将更长。我通常在配置文件中保留环境变量,而在RC中保留别名。
富兰克林·于

@FranklinYu对许多人来说可能不是什么大问题,但我完全同意!提醒人们,这是一个很好的技术要点,值得更多的批评。
Subfuzion

24

对于macOS,.bash_profile将所有内容整合到其中的代码.bashrc如下:

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

这是针对Mac终端用户的。


6
确实如此,这与Lurch从2012年以来的回答有何不同?
Arjan

0

TLDR;使用.bash_profile你的别名。

不同的初始化文件一起工作的方式有点复杂,并且OSX中有一些重要的特殊情况。以下是重点内容:

  • 在任何平台上,Bash都会根据调用方式执行多个不同文件之一。详细信息在这里
  • OSX的终端应用程序执行了一些非标准的操作:它会创建每个新的选项卡或窗口,就好像它是一个登录外壳一样,这.bash_profile就是所谓的。因此,上面的TLDR建议。
  • .bashrc也是一种选择,但都会被调用创建一个子shell时间(即调用bash),如果你在它更新一个变量,它可以创造效率低下(如PATH=/bin/foo:$PATH
  • 具有嵌入式终端的其他应用可以选择是否遵循终端应用的约定。值得注意的是,默认情况下Visual Studio Code不会
  • 通过GUI调用的应用程序不是从外壳生成的。因此,有几种竞争机制可以设置环境变量供他们查看,这些机制多年来已经发生了变化
  • 调用片段.bashrc.bash_profile相当普遍。我不建议这样做,但这是首选。

为什么使用.bash_profile别名确实很复杂?您只列出的部分内容完全是关于别名的,因此,不仅仅列出一些项目符号可能会解释为什么它看起来很复杂的方法,您是否可以提出一种方法来简化这些限制条件呢?
nohillside

我明白你的意思。并不是说使用.bash_profile很复杂。这是因为文件的调用方式很复杂。我会更新。
狮子座

在GNU bash手册中建议从.bash_profile调用.bashrc-否则如何设置登录外壳程序和非交互外壳程序中都需要的变量等?
标记

我在不同操作系统上使用的每个终端仿真器都有一个选项可以运行新窗口作为登录shell,xterm和Xfce仅举两个。
fd0
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.