Warum muss ich "/ bin / bash --login" ausführen?


11

Ich habe gerade einen neuen Ubuntu 13.10-Server mit Ruby 2.1.1 eingerichtet rvm.

Das Problem ist, dass ich jedes Mal, wenn ich zum Benutzer "Rails" (dem Benutzer, mit dem ich Ruby und Rails installiert habe) wechsle, laufen muss, /bin/bash --loginbevor Ubuntu erkennt, dass Ruby, Rails oder rvminstalliert sind.

Hoffe jemand weiß:

  1. Was macht der obige Befehl?
  2. Warum muss ich es ausführen?
  3. und was kann ich tun, um es ein für alle Mal zu lösen? :) :)

Jede Hilfe wird geschätzt!


2
Wie wechseln Sie zu Benutzer "Rails" (normal su? Oder so ähnlich su -loder su --?). Was ist die Login-Shell für Benutzer "Rails"? Haben Sie die PATH-Variable des Benutzers geändert und wenn ja, in welcher Datei ( ~/.profileoder ~/.bashrcoder ~/.bash_profileoder ...?)
steeldriver

Ich sehe jetzt, dass das Problem nur auftritt, wenn ich den Befehl su verwende, um vom Root-Benutzer zum Rails-Benutzer zu wechseln. Wenn ich mich beim Rails-Benutzer anmelde, tritt dieses Problem nicht auf. Allerdings würde ich immer noch gerne wissen, was / bin / bash --login macht. :)
Ole Henrik Skogstrøm

Antworten:


11

Es klingt so, als ob die Umgebung, die das System benötigt, um die installierten Ruby-Komponenten zu finden, in einer Datei angegeben ist, die nur für Login-Shells gelesen wird. Auf der Bash-Handbuchseite wird Folgendes über den Unterschied zwischen Login-Shells und Nicht-Login-Shells gesagt:

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

und

   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.  

wohingegen

   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. 

Wenn sich die Ruby-Umgebungsvariablen beispielsweise in /home/rails/.profileoder befinden /etc/profile, werden sie der Shell-Umgebung hinzugefügt

  • durch explizites Aufrufen einer Login-Shell mit su -l railsoder su --login railsoder der Kurzformsu - rails
  • wenn sich der Benutzer railsüber SSH anmeldet
  • durch Starten einer Subshell wie bash --loginnach dem Login

Wenn Sie möchten, dass die Ruby-Umgebung unabhängig davon festgelegt wird, wie Sie zum Benutzer wechseln rails, können Sie ~/.bashrcstattdessen die relevanten Variablendefinitionen in die des Benutzers verschieben .


Hmmm, ok, ich glaube ich brauche ein Beispiel für den letzten Teil. Ich bin neu in Linux und Ubuntu. Was sind die relevanten Variablendefinitionen? In welche Datei werden sie jetzt geschrieben? Könntest du mir ein Beispiel geben? Das ist etwas zu theoretisch.
Ole Henrik Skogstrøm

4

Ich weiß, dass diese Frage vor 2 Jahren gestellt wurde, aber falls jemand (wie ich) noch vor ihr steht: @steeldriver hat recht - Sie vermissen etwas in Ihrem, bashrcdas Sie in einer dieser 3 Dateien haben. In meinem Fall musste ich nur diese Zeile in meine einfügen ~/.bashrc:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.