我刚刚设置了一个新的 Ubuntu 13.10 服务器,并通过 安装了 ruby 2.1.1 rvm
。
问题是,每当我切换到用户“rails”(我安装 ruby 和 rails 的用户)时,我必须/bin/bash --login
先运行,Ubuntu 才能识别到 ruby、rails 或rvm
已安装。
希望有人知道:
- 上面的命令起什么作用?
- 我为什么需要运行它?
- 我该怎么做才能一劳永逸地解决这个问题?:)
任何帮助都将不胜感激!
答案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"