Bash lädt '.profile' in neuer Sitzung unter Linux nicht

22

Ich richte eine neue Linux-Maschine ein, die ich von unserer IT-Abteilung erhalten habe, und habe festgestellt, dass .profilesie beim Starten einer neuen Terminalsitzung nicht geladen wird. Die aktuelle Shell ist Bash , obwohl ich sie von der Standard- Shell geändert habe, mit der sie geliefert wurde . Wie lade ich es .profilebeim Start?

Ich greife auf die Shell via SSH : ssh myusername@remotemachine. Ich habe Administratorrechte.

sa125
quelle
Zeigen Sie uns den Befehl, mit dem Sie Ihre Shell starten.
Nifle

Antworten:

24

Wenn Bash als interaktive Anmeldeshell gestartet wird, handelt es sich möglicherweise um eine der Dateien, die verarbeitet werden ~/.profile.

Wenn es als interaktive Shell ohne Anmeldung gestartet wird, geschieht dies nicht. Es verarbeitet /etc/bash.bashrc(wenn diese Datei oder eine ähnliche Datei in Ihrer Version von Bash aktiviert ist) und ~/.bashrc.

Sie können Folgendes hinzufügen ~/.bashrc(achten Sie jedoch darauf, dass Schleifen oder Werte nicht versehentlich geändert werden):

. $HOME/.profile
Bis auf weiteres angehalten.
quelle
8
Wenn Sie Ihre .bashrc-Quelle für Ihr .profil haben möchten (was ich nicht empfehle), sollten Sie etwas Schutz vor Double-Sourcing haben. Stellen Sie eine Schutzvariable oder so ein [ -z "$SOME_VAR_SET_IN_PROFILE" ] && . ~/.profile
Rich Homolka
2
Ja, ich kann es auch nicht wirklich empfehlen.
Bis auf weiteres angehalten.
12
Eine Anmeldeshell versucht, ~ / .bash_profile, ~ / .bash_login und ~ / .profile in der angegebenen Reihenfolge auszuführen und öffnet nur die erste gefundene.
Beano
3
Wie andere bereits gesagt haben, wird dies NICHT empfohlen, da die übliche Methode darin besteht, .bashrc als Quelle für Profile und "Freunde" (.bash_profile) zu verwenden und nicht umgekehrt. Es kann sein, dass Ihr Terminalprogramm KEINE Anmelde-Shell ist, sondern eine interaktive Nicht-Anmelde-Shell. Oft gibt es eine Voreinstellung, die Sie festlegen können - machen Sie es zu einer Login-Shell, um .profile, .login und / oder .bash_profile auszuführen.
Stockholmes
15

Es hängt davon ab, wie Sie Ihre Shell starten. Wie bereits erwähnt, lädt eine Login-Shell Ihr Profil (sie sucht zuerst nach .bash_profile und versucht es dann mit .profile). Wenn es eines davon findet, lädt es sie. Eine Shell ohne Anmeldung (entweder interaktiv oder nicht interaktiv) gibt .bashrc aus.

Ich würde vorschlagen, alles in .bashrc zu setzen. Die Aufteilung .profile / .bashrc war willkürlich und in den alten Tagen von UNIX sinnvoller, als tty nicht nur ein Gerätename war und einen tatsächlichen TeleType bedeutete. Es sollte bestimmte Dinge (wie das Überprüfen von E-Mails) beim "Haupt" -Login auf einem Server starten und nur normale Setup-Sachen für andere Shells. In den meisten Linuxes werden Sie sich jetzt anmelden, Sie melden sich nicht wirklich bei einer Shell an, da Sie sich bei einer grafischen Oberfläche (KDE, Gnome, CDE 'shudder') anmelden. Die "Spawn Login Prozesse" werden jetzt von Ihrem Session Manager erledigt. Es ist jetzt viel weniger relevant.

Mein Vorschlag: Machen Sie Ihr .profile ausschließlich aus:

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

Als erste Zeile von .bashrc schützen Sie sich vor seltsamen Dingen, die beim Ausführen eines Bash-Skripts auftreten, indem Sie frühzeitig aussteigen:

[[ $- != *i* ]] && return
Reiche Homolka
quelle
5
.profilesollte bash agnostisch gehalten werden. Ich empfehle zu konfigurieren, um .bash_profilezu laden .profileund dann zu laden .bashrc. lege nur bash agnostische Sachen hinein .profile, wie PATHund die LC_*Sachen. Leg den Rest rein .bashrc.
Lesmana
@Rich Homolka Warum ist [-f $ HOME / .bashrc] zweimal in Ihrem Befehl? Inwiefern unterscheidet sich der von Ihnen gepostete Befehl von '. $ HOME / .bashrc '?
David Doria
1
Protip: Fügen Sie nichts in Ihre .bashrc-Datei ein, das in stdout oder stderr schreibt, da dies nicht interaktive Clients für Dinge wie SCP beschädigen kann. Dinge mit Ausgabe (zum Beispiel, die ich gerne mit einem Glückskeks und einer Verfügbarkeit begrüßen würde) sollten nur in .profile / .bash_profile
Brian A. Henning
@ Lotharyx wahr. Wir hatten einen Standard-ish kshrc, der nach stdout exportierte und Xserver ausbrach (Kolibri überschritten)
Rich Homolka