配置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启动,它将读取以下文件:
-
~/.bash_profile
-
~/.profile
-
~/.bashrc
如果bash作为交互式非登录shell启动:
-
~/.bashrc
你应该在~/.bashrc
放入特定于bash的东西,在~/.profile
放入非特定于bash的东西。 例如, PATH
进入~/.profile
, HISTCONTROL
进入~/.bashrc
。
请注意~/.profile
不是特定于bash的。 其他基于文本的shell(例如sh或ksh)和图形shell(gnome)也读取~/.profile
。 这就是为什么你不应该在~/.profile
放入bash特定的东西。
这既不是糟糕的设计决策,也不是错误,也不是shell和终端的预期行为
它只是Gnome Terminal中每个配置文件配置选项的一个不幸的默认值,您可以轻松修复它。
-
转到编辑 – > 配置文件首选项 。
-
选择标题和命令选项卡。
-
请注意如何取消选中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