Pourquoi dois-je exécuter «/ bin / bash --login»


12

Je viens de configurer un nouveau serveur Ubuntu 13.10 avec ruby ​​2.1.1 installé via rvm.

Le problème est que chaque fois que je passe à l'utilisateur "rails" (l'utilisateur avec /bin/bash --loginlequel j'ai installé ruby ​​et rails), je dois exécuter avant qu'Ubuntu ne reconnaisse que ruby, rails ou rvmest installé.

J'espère que quelqu'un sait:

  1. Que fait la commande ci-dessus?
  2. pourquoi dois-je l'exécuter?
  3. et que puis-je faire pour le résoudre une fois pour toutes? :)

Toute aide est appréciée!


2
Comment passez-vous aux "rails" utilisateur (simple su? Ou quelque chose comme su -lou su --?). Qu'est-ce que le shell de connexion pour les "rails" utilisateur? Avez-vous modifié la variable PATH de l'utilisateur et si oui, dans quel fichier ( ~/.profileou ~/.bashrcou ~/.bash_profileou ...?)
steeldriver

Je vois maintenant que le problème se produit uniquement lorsque j'utilise la commande su pour passer de l'utilisateur root à l'utilisateur rails. Lorsque je ssh avec l'utilisateur de rails, ce problème ne se produit pas. Cependant, j'aimerais toujours savoir ce que fait / bin / bash --login. :)
Ole Henrik Skogstrøm

Réponses:


11

Il semble que l'environnement nécessaire au système pour trouver les composants ruby ​​installés est spécifié dans un fichier qui n'est lu que pour les shells de connexion. La page de manuel bash a ceci à dire sur la différence entre les shells de connexion et les shells sans connexion:

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

et

   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.  

tandis 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. 

Par conséquent, si les variables d'environnement ruby ​​sont dans /home/rails/.profileou /etc/profilepar exemple, elles seront ajoutées à l'environnement shell

  • en invoquant explicitement un shell de connexion en utilisant su -l railsou su --login railsou le raccourcisu - rails
  • lorsque l'utilisateur se railsconnecte via SSH
  • en lançant un sous-shell comme bash --loginaprès la connexion

Si vous souhaitez que l'environnement ruby ​​soit défini quelle que soit la façon dont vous basculez vers l'utilisateur rails, vous pouvez déplacer les définitions de variable pertinentes vers l'utilisateur à la ~/.bashrcplace.


Hmmm, ok, je pense que j'ai besoin d'un exemple de la dernière partie. Je suis nouveau sur Linux et Ubuntu. Quelles sont les définitions de variables pertinentes? Dans quel dossier sont-ils écrits maintenant? pourriez-vous me donner un exemple? C'est un peu théorique.
Ole Henrik Skogstrøm

5

Je sais que cette question a été posée il y a 2 ans, mais au cas où quelqu'un (comme moi) y serait toujours confronté: @steeldriver a raison - il vous manque quelque chose dans votre bashrcque vous avez dans l'un de ces 3 fichiers. Dans mon cas, j'avais juste besoin d'ajouter cette ligne dans la mienne ~/.bashrc:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.