Por que preciso executar "/ bin / bash --login"


11

Acabei de configurar um novo servidor Ubuntu 13.10 com o ruby ​​2.1.1 instalado rvm.

O problema é que sempre que eu mudo para o usuário "rails" (o usuário com o qual eu instalei o ruby ​​e o rails) eu tenho que executar /bin/bash --loginantes que o Ubuntu reconheça que o ruby, rails ou rvmestá instalado.

Espero que alguém saiba:

  1. O que o comando acima faz?
  2. por que preciso executá-lo?
  3. e o que posso fazer para resolvê-lo de uma vez por todas? :)

Qualquer ajuda é apreciada!


2
Como você está mudando para o usuário "rails" (simples su? Ou algo parecido su -lou su --?). Qual é o shell de login para o usuário "rails"? Será que quis modificar variável PATH do utilizador e em caso afirmativo, em qual arquivo ( ~/.profileou ~/.bashrcou ~/.bash_profileou ...?)
steeldriver

Vejo agora que o problema ocorre apenas quando uso o comando su para alternar entre o usuário root e o usuário do Rails. Quando ssh com o usuário de trilhos, esse problema não acontece. No entanto, eu ainda gostaria de saber o que / bin / bash --login faz. :)
Ole Henrik Skogstrøm

Respostas:


11

Parece que o ambiente necessário para o sistema encontrar os componentes ruby ​​instalados é especificado em um arquivo que é lido apenas para shells de login. A página do manual do bash tem a dizer sobre a diferença entre shells de login e shells de não login:

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

e

   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.  

enquanto que

   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. 

Portanto, se as variáveis ​​de ambiente ruby ​​estiverem dentro /home/rails/.profileou /etc/profilepor exemplo, elas serão adicionadas ao ambiente shell

  • invocando explicitamente um shell de login usando su -l railsou su --login railsou a abreviaçãosu - rails
  • quando o usuário railsefetua login via SSH
  • iniciando um subshell como bash --loginapós o login

Se você deseja que o ambiente ruby ​​seja definido independentemente de como você alterna para o usuário rails, você pode mover as definições de variáveis ​​relevantes para o usuário ~/.bashrc.


Hmmm, ok, acho que preciso de um exemplo da última parte. Eu sou novo no linux e no ubuntu. Quais são as definições de variáveis ​​relevantes? Em que arquivo eles estão escritos agora? Você poderia me dar um exemplo? Isso é um pouco teórico.
Ole Henrik Skogstrøm

4

Eu sei que essa pergunta foi feita há 2 anos, mas se alguém (como eu) ainda a enfrentar: @steeldriver está certo - você está perdendo algo no seu bashrcque você tem em um desses 3 arquivos. No meu caso, eu só precisava adicionar esta linha à minha ~/.bashrc:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.