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 --login
der 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 --login
Option gestartet .
Normalerweise soll die Bash immer ~/.bashrc
in einer interaktiven Shell gelesen werden . Hier ist, wie ich das empfehle:
Erstellen Sie eine ~/.bash_profile
Datei. Wenn bash als Login-Shell gestartet wird, ~/.bash_profile
sucht 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:
~/.bash_profile
~/.profile
~/.bashrc
und wenn bash als interaktive Nicht-Login-Shell gestartet wird:
~/.bashrc
Sie sollten Sachen einfügen, die bash-spezifisch sind, ~/.bashrc
und Sachen, die nicht bash-spezifisch sind ~/.profile
. Zum Beispiel PATH
geht rein ~/.profile
und HISTCONTROL
geht rein ~/.bashrc
.
Beachten Sie, dass dies ~/.profile
nicht 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
.
~/.bashrc
der an erster Stelle stehen soll, in das Profil einfügt . Der Fehler liegt bei rvm.~/.profile
.bashrc
zu erledigenden Aufgaben steuern kann . Wenn die interaktive Shell immer liest.bashrc
sollte das vorher oder nachher sein.profile
? Was ist, wenn Sie einige Dinge einrichten möchten,.bashrc
die.profile
für Sie selbstverständlich sind? Und gleichzeitig möchten Sie, dass einige Dinge.bashrc
von etwas abhängen, das von Ihnen eingerichtet wurde.profile
? Keine der Ladereihenfolgen erfüllt beide Szenarien.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.
Gehen Sie zu Bearbeiten -> Profileinstellungen .
Wählen Sie die Registerkarte Titel und Befehl .
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
Default
Profil 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
-l
Option an die Shell weitergibt.quelle
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 :)
quelle
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
:quelle