Почему мне нужно запустить «/ bin / bash --login»


12

Я только что установил новый сервер Ubuntu 13.10 с ruby ​​2.1.1, установленным через rvm.

Проблема заключается в том, что всякий раз, когда я переключаюсь на пользовательские «rails» (пользователь, с которым я установил ruby ​​и rails), мне приходится запускаться /bin/bash --loginдо того, как Ubuntu распознает этот ruby, rails или rvmустановлен.

Надеюсь, кто-то знает:

  1. Что делает команда выше?
  2. зачем мне его запускать?
  3. и что я могу сделать, чтобы решить это раз и навсегда? :)

Любая помощь приветствуется!


2
Как вы переходите на пользовательские "рельсы" (обычный su? Или что-то вроде su -lили su --?). Что такое оболочка входа для пользователя "rails"? Изменяли ли вы переменную PATH пользователя и, если да, то в каком файле ( ~/.profileили ~/.bashrcили ~/.bash_profileили ...?)
steeldriver

Теперь я вижу, что проблема возникает только тогда, когда я использую команду su для переключения с пользователя root на пользователя rails. Когда я ssh в с пользователем рельсов, эта проблема не происходит. Однако я все еще хотел бы знать, что делает / bin / bash --login. :)
Оле Хенрик Скогстрём,

Ответы:


11

Похоже, среда, необходимая для системы, чтобы найти установленные компоненты ruby, указана в файле, который читается только для оболочек входа в систему. На странице справочной системы bash есть информация о разнице между оболочками для входа и не для входа:

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например, они будут добавлены в среду оболочки

  • явно вызывая оболочку входа в систему, используя su -l railsили su --login railsили сокращениеsu - rails
  • когда пользователь railsвходит через SSH
  • запустив подоболочку как bash --loginпосле входа в систему

Если вы хотите, чтобы среда ruby ​​была установлена ​​независимо от того, как вы переключаетесь на пользователя rails, вы можете ~/.bashrcвместо этого переместить соответствующие определения переменных в пользователя .


Хммм, хорошо, я думаю, мне нужен пример последней части. Я новичок в Linux и Ubuntu. Каковы соответствующие определения переменных? В каком файле они написаны сейчас? не могли бы вы привести пример? Это немного теоретически.
Оле Хенрик Скогстрём,

5

Я знаю, что этот вопрос был задан 2 года назад, но в случае, если кто-то (как я) все еще сталкивается с этим: @steeldriver прав - вы пропускаете что-то в своем, bashrcчто у вас есть в одном из этих 3 файлов. В моем случае мне просто нужно было добавить эту строку в мою ~/.bashrc:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.