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

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

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

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

这是预期的行为吗?

是的,这是预期的行为。

简而言之,这种行为如下:

  • bash最初是一个交互式登录shell:读取~/.profile
  • bash最初是一个交互式非登录shell:读取~/.bashrc

有关更多详细信息,请阅读有关启动文件的bash手册 。

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


对术语的一些解释:

  • 交互式shell是一个可以与之交互的shell,这意味着您可以在其中键入命令。 您将使用的大多数shell都是交互式shell。
  • 非交互式shell是一个无法与之交互的shell。 Shell脚本在非交互式shell中运行。
  • 登录shell是在您登录系统时启动的shell。
  • 非登录 shell是在登录过程后启动的shell。

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

有一个选项--login可以使bash表现得好像它是一个登录shell,即使你已经登录后启动。配置gnome-terminal启动bash作为登录shell意味着它将使用--login选项启动bash 。


通常你希望bash总是在交互式shell中读取~/.bashrc 。 以下是我建议的方法:

创建一个~/.bash_profile文件。 如果bash作为登录shell启动,它将首先查找~/.bash_profile然后再查找~/.profile 。 如果bash找到~/.bash_profile那么它将不会读取~/.profile

将以~/.bash_profile放在~/.bash_profile

 [ -f "$HOME/.profile" ] && source "$HOME/.profile" [ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc" 

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

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

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

  1. ~/.bashrc

你应该在~/.bashrc放入特定于bash的东西,在~/.profile放入非特定于bash的东西。 例如, PATH进入~/.profileHISTCONTROL进入~/.bashrc

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

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

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

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

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

  3. 请注意如何取消选中Run命令作为登录shell复选框! 核实。

而已。 如果对Default配置文件执行此操作,或者在创建新终端时配置为使用任何配置文件,则会获得登录shell。

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

我有同样的问题,并找到了解决方案:只需使用SSH进行真正的登录shell!

1.以超级用户身份创建专用rvm系统用户以进行完全隔离,并指定密码:

sudo su

useradd -m rvmuser

passwd rvmuser

2.安装依赖项,以便rvm可以在不要求超级用户密码的情况下构建rubies:

apt-get install curl gawk libreadline6-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake bison libffi-dev

3. SSH进入localhost以获得真正的登录shell(您可能需要apt-get install ssh

ssh rvmuser@localhost

4.安装rvm

\curl -sSL https://get.rvm.io | bash -s stable

5.再次注销并重新登录,以便加载所有rvm函数

exit

ssh rvmuser@localhost

6.使用rvm 🙂

当使用bash将配置文件初始化放在.bash_profile时很常见,这在登录时只能由bash读取,而其他shell历史上共享.profile 。 这允许您在.bash_profile放置特定于bash的命令。

通常使用以下内容来获取.bashrc中定义的别名:

 # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi