配置 gnome-terminal 以启动 bash 作为登录 shell,不读取 .bashrc

Art*_*ero 27 rvm bash gnome-terminal .profile bashrc

我正在尝试将 RVM 与 gnome-terminal 集成

默认情况下,gnome-terminal 不会将 bash 作为登录 shell 启动。我run command as a login shell按照这个答案中的建议启用了关于设置 RVM 的相同主题,但是当我这样做时,.bashrc文件没有被读取。

例如,我创建了一个环境变量.bashrc,然后当我启动一个新的 gnome-terminal 时,我无法读取它。我需要显式运行source .bashrc才能读取文件。

这是预期的行为吗?

les*_*ana 44

是的,这是预期的行为。

简而言之,行为如下:

  • bash 作为交互式登录 shell 启动:读取 ~/.profile
  • bash 作为交互式非登录 shell 启动:读取 ~/.bashrc

阅读有关启动文件bash 手册以获取更多详细信息。

就我个人而言,我认为这种行为很奇怪,我还没有找到这种设计决策的合理性。


术语的一些解释:

  • 一个交互shell是与您可以互动,你可以在其中输入命令意味着一个壳。您将使用的大多数 shell 都是交互式 shell。
  • 一个非交互的shell是一个外壳,你不能相互作用。Shell 脚本在非交互式 shell 中运行。
  • 一个登录shell是,当你登录到你的系统启动外壳。
  • 一个非登录shell是其在登录过程后启动的外壳。

您看到的大多数 shell 都是交互式非登录 shell。如果您正在运行像 gnome 这样的图形环境,则尤其如此,因为 gnome 是“登录外壳”。在 gnome 中启动的任何 bash 会话都是非登录 shell。如果您想查看真正的交互式登录 shell,请转到虚拟控制台(使用Ctrl+Alt+F1),然后使用您的用户名和密码登录。那是一个真正的交互式登录 bash shell。您可以使用 返回到图形外壳Ctrl+Alt+F7

有一个选项--login可以使 bash 的行为就像是登录 shell,即使在您登录后启动。配置 gnome-terminal 将 bash 作为登录 shell 启动意味着它将使用该--login选项启动 bash 。


通常,您希望 bash 始终~/.bashrc在交互式 shell 中读取。以下是我建议这样做的方法:

创建一个~/.bash_profile文件。如果 bash 作为登录 shell 启动,它将~/.bash_profile在查找~/.profile. 如果 bash 找到,~/.bash_profile则它不会读取~/.profile.

将以下几行放入~/.bash_profile

[ -f "$HOME/.profile" ] && source "$HOME/.profile"
[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"
Run Code Online (Sandbox Code Playgroud)

现在,如果 bash 作为交互式登录 shell 启动,它将读取以下文件:

  1. ~/.bash_profile
  2. ~/.profile
  3. ~/.bashrc

如果 bash 作为交互式非登录 shell 启动:

  1. ~/.bashrc

您应该将 bash 特定的内容~/.bashrc和非 bash 特定的内容放入~/.profile. 例如PATH进去~/.profileHISTCONTROL进去~/.bashrc

请注意,这~/.profile不是特定于 bash 的。其他基于文本的 shell(例如 sh 或 ksh)和图形 shell(gnome)也读取~/.profile. 这就是为什么你不应该把 bash 特定的东西放在~/.profile.


小智 14

这既不是一个糟糕的设计决策,也不是一个错误,也不是 shell 和终端的预期行为

这只是 Gnome 终端中每个配置文件配置选项的不幸默认值,您可以轻松修复。

  1. 转到编辑->配置文件首选项

  2. 选择标题和命令选项卡。

  3. 注意Run command as login shell复选框是如何取消选中的!核实。

就是这样。如果您对Default配置文件或任何配置为在创建新终端时使用的配置文件执行此操作,您将获得一个登录 shell。

我猜在幕后,这个选项可能会导致它将该选项传递-l给 shell。