Konfigurieren Sie gnome-terminal so, dass bash als Anmeldeshell gestartet wird und nicht .bashrc

24

Ich versuche, RVM mit Gnome-Terminal zu integrieren .

Standardmäßig startet gnome-terminal bash nicht als Login-Shell. Ich habe, run command as a login shellwie in dieser Antwort vorgeschlagen, zum selben Thema das Einrichten von RVM aktiviert , aber wenn ich dies tue, wird die .bashrcDatei nicht gelesen.

Zum Beispiel erstelle ich eine Umgebungsvariable in .bashrcund wenn ich dann ein neues Gnome-Terminal starte, kann ich es nicht lesen. Ich muss explizit ausführen source .bashrc, um die Datei zu lesen.

Ist das das erwartete Verhalten?

Arturo Herrero
quelle

Antworten:

38

Ja, das ist das erwartete Verhalten.

Das Verhalten ist, kurz gesagt, wie folgt:

  • bash startete als interaktive Login-Shell: liest ~/.profile
  • bash wurde als interaktive Shell ohne Anmeldung gestartet: reads ~/.bashrc

Weitere Informationen finden Sie im bash-Handbuch zu Startdateien .

Persönlich halte ich dieses Verhalten für seltsam und habe noch keine Erklärung für diese Entwurfsentscheidung gefunden.


Einige Erklärungen zur Terminologie:

  • Eine interaktive Shell ist eine Shell, mit der Sie interagieren können, dh, Sie können darin Befehle eingeben. Die meisten Shells, die Sie verwenden, sind interaktive Shells.
  • Eine nicht interaktive Shell ist eine Shell, mit der Sie nicht interagieren können. Shell-Skripte werden in nicht interaktiven Shells ausgeführt.
  • Eine Login-Shell ist die Shell, die gestartet wird, wenn Sie sich bei Ihrem System anmelden.
  • Eine Nicht-Login- Shell ist eine Shell, die nach dem Login-Vorgang gestartet wird.

Die meisten Shells, die Sie sehen, sind interaktive Shells ohne Anmeldung . Dies gilt insbesondere dann, wenn Sie eine grafische Umgebung wie gnome ausführen, da gnome dann die "Anmeldeshell" ist. Jede Bash-Sitzung, die in gnome gestartet wird, ist eine Nicht-Login-Shell. Wenn Sie eine echte interaktive Anmeldeshell sehen möchten, gehen Sie zu einer virtuellen Konsole (mit Ctrl+Alt+F1) und melden Sie sich mit Ihrem Benutzernamen und Kennwort an. Das ist eine echte interaktive Login-Bash-Shell. Sie können mit zur grafischen Shell zurückkehren Ctrl+Alt+F7.

Es gibt eine Option, mit --loginder sich Bash so verhält, als wäre es eine Anmeldeshell, auch wenn sie nach dem Anmelden gestartet wurde. Wenn Sie Gnome-Terminal so konfigurieren, dass Bash als Anmeldeshell gestartet wird, wird Bash mit dieser --loginOption gestartet .


Normalerweise soll die Bash immer ~/.bashrcin einer interaktiven Shell gelesen werden . Hier ist, wie ich das empfehle:

Erstellen Sie eine ~/.bash_profileDatei. Wenn bash als Login-Shell gestartet wird, ~/.bash_profilesucht es zuerst nach, bevor es danach sucht ~/.profile. Wenn bash findet ~/.bash_profile, wird es nicht gelesen ~/.profile.

Fügen Sie die folgenden Zeilen ein ~/.bash_profile:

[ -f "$HOME/.profile" ] && source "$HOME/.profile"
[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"

Wenn bash nun als interaktive Anmeldeshell gestartet wird, werden die folgenden Dateien gelesen:

  1. ~/.bash_profile
  2. ~/.profile
  3. ~/.bashrc

und wenn bash als interaktive Nicht-Login-Shell gestartet wird:

  1. ~/.bashrc

Sie sollten Sachen einfügen, die bash-spezifisch sind, ~/.bashrcund Sachen, die nicht bash-spezifisch sind ~/.profile. Zum Beispiel PATHgeht rein ~/.profileund HISTCONTROLgeht rein ~/.bashrc.

Beachten Sie, dass dies ~/.profilenicht bashspezifisch ist. Andere textbasierte Shells (zum Beispiel sh oder ksh) und grafische Shells (Gnome) können ebenfalls gelesen werden ~/.profile. Aus diesem Grund sollten Sie keine speziellen Bash-Inhalte hinzufügen ~/.profile.

lesmana
quelle
1
+1. Danke, das hat mich die Wand
hochgetrieben
1
mywiki.wooledge.org/DotFiles erklärt eine Geschichte, warum es so ist wie es ist. Der Hauptgrund für dieses Problem mit rvm ist jedoch, dass rvm Code, ~/.bashrcder an erster Stelle stehen soll, in das Profil einfügt . Der Fehler liegt bei rvm.
Geirha
Laut @geirha sollten sie verwendet haben~/.profile
Sanmai
Der Grund dafür ist, dass das Profilskript die Bewertung der .bashrczu erledigenden Aufgaben steuern kann . Wenn die interaktive Shell immer liest .bashrcsollte das vorher oder nachher sein .profile? Was ist, wenn Sie einige Dinge einrichten möchten, .bashrcdie .profilefür Sie selbstverständlich sind? Und gleichzeitig möchten Sie, dass einige Dinge .bashrcvon etwas abhängen, das von Ihnen eingerichtet wurde .profile? Keine der Ladereihenfolgen erfüllt beide Szenarien.
Kaz
11

Dies ist weder eine schlechte Designentscheidung noch ein Fehler noch ein erwartetes Verhalten von Shells und Terminals

Es ist lediglich ein unglücklicher Standardwert einer Konfigurationsoption pro Profil in Gnome Terminal, den Sie leicht korrigieren können.

  1. Gehen Sie zu Bearbeiten -> Profileinstellungen .

  2. Wählen Sie die Registerkarte Titel und Befehl .

  3. Beachten Sie, dass das Kontrollkästchen Befehl als Anmeldeshell ausführen deaktiviert ist! Prüfen Sie.

Das ist es. Wenn Sie dies für das DefaultProfil oder für ein anderes Profil tun, das für die Erstellung neuer Terminals konfiguriert ist, erhalten Sie eine Anmeldeshell.

Ich vermute, dass diese Option unter der Haube wahrscheinlich dazu führt, dass sie die -lOption an die Shell weitergibt.

Gast
quelle
0

Ich hatte die gleiche Frage und fand eine Lösung: Verwenden Sie einfach SSH für eine echte Login-Shell!

1. Erstellen Sie als Superuser einen dedizierten rvm-Systembenutzer für die vollständige Isolation und vergeben Sie ein Kennwort:

sudo su

useradd -m rvmuser

passwd rvmuser

2. Installieren Sie Abhängigkeiten, damit rvm Rubine erstellen kann, ohne nach dem Superuser-Passwort zu fragen:

apt-get install curl gawk libreadline6-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake bison libffi-dev

3. SSH in localhost für eine echte Login-Shell (müssen Sie möglicherweise apt-get install ssh)

ssh rvmuser@localhost

4. Installieren Sie rvm

\curl -sSL https://get.rvm.io | bash -s stable

5. Melden Sie sich ab und wieder an, damit alle rvm-Funktionen geladen werden

exit

ssh rvmuser@localhost

6. Benutze rvm :)

Michael Franzl
quelle
0

Es ist üblich, mit bash die Profilinitialisierung zu platzieren .bash_profile, die beim Anmelden nur von bash gelesen wird, während andere Shells in der Vergangenheit gemeinsam genutzt wurden .profile. Auf diese Weise können Sie bash-spezifische Befehle eingeben .bash_profile.

Die folgenden Aktionen werden normalerweise ausgeführt, um die Aliase einzuziehen, die in definiert sind .bashrc:

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
Rob Prentice
quelle