为什么我需要运行“/bin/bash --login”

为什么我需要运行“/bin/bash --login”

我刚刚设置了一个新的 Ubuntu 13.10 服务器,并通过 安装了 ruby​​ 2.1.1 rvm

问题是,每当我切换到用户“rails”(我安装 ruby​​ 和 rails 的用户)时,我必须/bin/bash --login先运行,Ubuntu 才能识别到 ruby​​、rails 或rvm已安装。

希望有人知道:

  1. 上面的命令起什么作用?
  2. 我为什么需要运行它?
  3. 我该怎么做才能一劳永逸地解决这个问题?:)

任何帮助都将不胜感激!

答案1

听起来,系统查找已安装的 ruby​​ 组件所需的环境是在仅供登录 shell 读取的文件中指定的。bash 手册页对登录 shell 和非登录 shell 之间的区别有如下说明:

INVOCATION
   A  login shell is one whose first character of argument zero is a -, or
   one started with the --login option.

   When bash is invoked as an interactive login shell, or as a non-inter‐
   active shell with the --login option, it first reads and executes  com‐
   mands  from  the file /etc/profile, if that file exists. After reading
   that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,
   in  that order, and reads and executes commands from the first one that
   exists and is readable.  

然而

   When an interactive shell that is not a login shell  is  started,  bash
   reads  and  executes  commands  from /etc/bash.bashrc and ~/.bashrc, if
   these files exist. 

因此,如果 ruby​​ 环境变量在/home/rails/.profile/etc/profile例如,它们将被添加到 shell 环境中

  • su -l rails通过使用或su --login rails或简写显式调用登录 shellsu - rails
  • 当用户rails通过 SSH 登录时
  • bash --login通过登录后启动子 shell

如果您希望无论如何切换到用户都设置 ruby​​ 环境rails,则可以将相关变量定义移动到用户~/.bashrc

答案2

我知道这个问题是 2 年前提出的,但如果有人(像我一样)仍然面临这个问题:@steeldriver 是对的——你遗漏了bashrc这 3 个文件中确实有的某些内容。就我而言,我只需要将这一行添加到我的文件中~/.bashrc

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

相关内容