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


24

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

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

例如,我在中创建一个环境变量.bashrc,然后在启动新的gnome终端时无法读取它。我需要明确运行source .bashrc以读取文件。

这是预期的行为吗?

Answers:


38

是的,这是预期的行为。

简而言之,行为如下:

  • bash作为交互式登录外壳开始: ~/.profile
  • bash作为交互式非登录外壳程序开始: ~/.bashrc

阅读bash手册中有关启动文件的更多信息。

就我个人而言,我认为这种行为很奇怪,并且我还没有找到合理的设计方案。


有关术语的一些解释:

  • 一个交互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配置为以登录shell启动bash意味着它将使用该--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"

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

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

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

  1. ~/.bashrc

您应该将特定于bash的东西放进,~/.bashrc而非特定于bash的东西放进~/.profile。例如PATH进去~/.profileHISTCONTROL进去~/.bashrc

请注意,这~/.profile并非特定于bash。其他基于文本的外壳程序(例如sh或ksh)和图形外壳程序(gnome)也可以阅读~/.profile。这就是为什么您不应该将bash特定的内容放入其中的原因~/.profile


1
+1。谢谢,这把我
逼到

1
mywiki.wooledge.org/DotFiles解释了为什么会这样。rvm出现此问题的主要原因是rvm会将代码~/.bashrc放在首位,而不是放在配置文件中。故障在rvm上。
geirha

根据@geirha,他们应该使用过~/.profile
sanmai,2016年

基本原理是概要文件脚本可以控制.bashrc相对于其需要执行的操作的评估。如果交互式外壳始终读取,.bashrc应该在此之前还是之后.profile?如果你想建立一些东西,什么.bashrc.profile想当然?在同一时间,你想在某些事情上.bashrc依靠的东西成立.profile?两种加载顺序都无法满足这两种情况。
卡兹(Kaz),

11

这既不是错误的设计决定,也不是错误,也不是外壳和端子的预期行为。

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

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

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

  3. 请注意,如何取消选中“作为登录外壳程序运行命令”复选框!检查。

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

我猜想这个选项可能会使它将该选项传递-l给外壳。


0

我遇到了同样的问题,并找到了解决方案:只需将SSH用于真实的登录shell!

1.以超级用户身份创建完全隔离的rvm系统专用用户,并分配密码:

sudo su

useradd -m rvmuser

passwd rvmuser

2.安装依赖项,以便rvm可以构建红宝石而无需询问超级用户密码:

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 :)


0

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

通常使用以下方法提取在中定义的别名.bashrc

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
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.