新打开终端时,.bashrc文件不会被执行。

每当我在Ubuntu 12.04打开一个新的终端窗口时,.bashrc中的代码不会执行。我注意到这一点是在创建.bash_aliases文件时。当我打开一个新的终端时,别名没有显示出来。然而,当我输入source .bashrc命令时,别名就显示出来了。
应该每次我打开一个新的终端窗口时都会运行.bashrc,对吗?
我该如何实现这个?

2试试使用.profile。 - jippie
5@jippie 不,.profile 是在登录时读取的,而不是在打开新终端时读取,除非有地方配置错误。Selah:你有改动默认配置吗?请在终端中运行 ps -o command $$ $PPID 并复制粘贴输出结果。 - Gilles 'SO- stop being evil'
1为了确保一切顺利,你确定把.bashrc放在你的主文件夹里了吗? - Jjed
4可能需要检查 echo $SHELL 命令。我也遇到过这个问题,shell 是 /bin/sh 而不是 bash。在 /etc/passwd 文件中修改后,它就会运行 .bashrc。 - Joe Flynn
这件事发生在我身上,因为我不小心运行了 $ rm -r ~ - Rockstar5645
4在我的情况下,删除未使用但已存在的$HOME/.bash_profile起作用了。 - K. Stopa
@K.Stopa еҲ йҷӨ~/.bash_profileзҡ„еҺҹеӣ жҳҜеӣ дёәBashдјҡдјҳе…ҲдҪҝз”Ёе®ғпјҢиҖҢдёҚжҳҜ~/.profileпјҢеҰӮжһңжүҫеҲ°зҡ„иҜқгҖӮ - BadHorsie
7个回答

这并不一定是运行的;在标准的 .bashrc 文件的顶部有这样的注释:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

我相信有一个选项可以将bash终端作为登录shell运行或不运行。在Ubuntu中,gnome-terminal通常不作为登录shell运行,因此应直接运行.bashrc。
对于登录shell(如虚拟终端),通常会运行文件~/.profile,除非您有~/.bash_profile或~/.bash_login,但它们默认情况下不存在。默认情况下,Ubuntu只使用.profile。
标准的.profile文件中包含以下内容:
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

如果可用,这将运行.bashrc - 假设$BASH_VERSION存在于您的环境中。您可以通过输入命令echo $BASH_VERSION来检查这一点,它应该显示一些版本号信息 - 不应为空。

4在理解了这些说明后,我打开了我的终端应用程序,然后点击编辑 -> 配置文件首选项 -> 标题和命令 -> 以登录 shell 运行命令。我取消了这个选项。感谢你的帮助。 - Selah
你能解释一下什么时候加载/读取.profile(以及.bashrc)吗?似乎这是在用户登录到他们的桌面会话时完成的。答案表明,当你启动一个新的终端/ shell 会话时会发生这种情况:“对于登录 shell(如虚拟终端),通常会运行文件~/.profile...” - hedgehog
5当您启动新的登录shell时(不是真正的桌面会话,因为您可以从桌面会话运行新的登录shell),它通常会运行。正如我所说,默认情况下会运行,但如果您创建了~/.bash_profile~/.bash_login,则不会运行。您可以通过在“编辑->配置文件首选项->标题和命令”中勾选或取消勾选“以登录shell方式运行命令”的复选框并退出重新运行终端来进行测试。您可以从.profile中echo出一些内容进行测试。 - Marty Fried
@Selah 你的评论比实际答案更有帮助;)非常感谢你留下这个评论! - Aleks
2如果您在系统上创建了~/.bash_profile~/.bash_login并希望保留它们,但仍然希望执行~/.profile和从那里执行~/.bashrc,您可以在自己的~/.bash_profile~/.bash_login中添加一行包含source "$HOME/.profile"的代码。这样,登录shell中也能够获得ls命令的彩色输出! - tanius
1谢谢你的帖子...只是提醒一下,这在RHEL上也有效... - jasonflaherty
@jasonflaherty - 很高兴在这么长的时间后能帮到你。我并不感到惊讶它也适用于其他发行版 - 它相当基础。 - Marty Fried
刚刚意识到我的终端加载的是zsh而不是bash!我修改了.zshrc文件,将别名源自.bash_aliases文件。 - Omkar76

在我的情况下,只是.bashrc加载器行在.bash_profile中丢失了。
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
fi

我手动添加了它,在我的新登录中可以使用


7.bash_profile?Ubuntu 默认使用 .profile,而不是 .bash_profile - muru

.bash_profile保存了bash shell的配置。当你打开终端时,它首先会读取并执行~/.bash_profile中的命令。因此,你可以在.bash_profile中添加以下内容来按照bashrc设置shell。

. ~/.bashrc

除非您的终端正在运行登录 shell(在 Ubuntu 默认情况下不是这样),否则 ~/.bash_profile 不会被读取(并且在 Ubuntu 默认情况下也不存在)。 - muru

根据.profile中的评论。
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.

所以,如果存在~/.bash_profile~/.bash_login,那么它们将被运行,而不是~/.profile
如果你想运行~/.bashrc,只需在bash_profile中添加一行source ~/.bashrc

1我也遇到了完全相同的问题。我的.bashrc文件正在被加载,直到我创建了一个.bash_profile文件。所以我在.bash_profile文件中加入了source ~/.bashrc这一行。 - Lashae

如果未设置$BASH_VERSION,请尝试使用chsh命令将您的shell设置为/bin/bash
我在12.04 LTS上遇到了类似的问题,结果发现新用户帐户的默认shell设置为/bin/sh,这是问题的原因。

这就是原因! - mulya
九年过去了,Ubuntu仍然以一个有问题的外壳吸引新用户... :-/ - yms

这对我来说相当简单。我安装了mssqltools,然后它在$HOME目录中创建了一个名为的文件。由于在bashrc之前运行,如果bash_profile中没有source命令,bashrc就不会执行。
解决这个问题有两种方法,要么删除bash_profile,要么如果您使用bash_profile,只需在文件的任意位置添加以下一行。
source ~/.bashrc

1在我的情况下,Meteor安装了一个 .bash_profile 文件。添加 source ~/.bashrc 就解决了! - dansch

在Ubuntu 20.x上,为了在打开终端时读取.bashrc文件,您应该将模板.profile复制到用户目录中(.bashrc.profile加载):
sudo cp /etc/skel/.profile ~/.profile && sudo chown $(whoami):$(whoami) ~/.profile