bashrc oder bash_profile?

49

Ich kenne den Unterschied zwischen den beiden Bash-Anmeldeskripten:

.bashrc wird nur von "non-login" -Shells ausgeführt.

.bash_profile(oder .bash_loginoder .profile) wird von "Login" -Shells ausgeführt.

Hat jemand ein paar gute Beispiele für Dinge, die besser für die reine Login-Ausführung geeignet sind, so dass ich sie nur einfügen würde, sie .bash_profileaber keinen Sinn ergeben würden .bashrc?

(Ich weiß , die meisten von uns beziehen .bashrcaus .bash_profile, so es scheint nicht zu viel in der entgegengesetzten Frage zu sein ...)

Don Faulkner
quelle
3
Siehe auch die gleiche Frage bei Super User .
Gilles 'SO- hör auf böse zu sein'

Antworten:

24

Da a .bashrcfür nicht angemeldete Shells gedacht ist, vermeide ich alle Befehle, die auf dem Bildschirm angezeigt werden. Ich habe auch Erfahrungen gemacht, bei denen echo-Anweisungen in .bashrcdazu führen, dass sftp- und rsync-Befehle fehlschlagen (und möglicherweise auch scp-Befehle).

# Print some information as we log in
# -s: OS Name -n: Node name -r: OS Release
uname -snr
uptime

Außerdem wird ssh-agent in der Regel nicht über eine nicht interaktive Shell ausgeführt. Also habe ich das in .bash_profile.

if [ -f ~/.ssh/ssh-agent ]; then . ~/.ssh/ssh-agent; fi
Stefan Lasiewski
quelle
2
Wenn Sie "~ / .profile" anstelle von "~ / .bash_profile" verwenden, funktionieren die Funktionen auch dann noch, wenn Sie die Shells wechseln. "~ / .Bash_profile" ist für bestimmte Bash-Aktionen vorgesehen.
LassePoulsen
1
Aber bash wird nur WEDER .bash_profile ODER .profile ausführen. Wenn Sie also beides verwenden möchten, müssen Sie .profile aus .bash_profile oder so was heraus beziehen. Das ist eigentlich keine schlechte Idee ...
Don Faulkner
@Source & @Don: Gute Punkte. Früher hatte ich Bashisms in meinem .bash_profil, jetzt bin ich auf etwas Universelleres umgestiegen. Möglicherweise ist die Verwendung von .profile in Ordnung.
Stefan Lasiewski
In Bezug auf Befehle zur Ausgabeerzeugung.bashrc , die die über Standard-Streams implementierten Remote-Dateitransfermethoden stören , besteht die Lösung darin, solche Befehle unter Code zu setzen, der prüft, ob die Shell interaktiv ist und nur fortgesetzt wird, wenn dies der Fall ist. Die Standarddateien der Benutzer .bashrcin Ubuntu, die /etc/skel/.bashrcbei der Kontoerstellung kopiert wurden , sowie die systemweite Datei /etc/bash.bashrcenthalten bereits Code, der prüft und zurückgibt, ob die Shell nicht interaktiv ist (obwohl die Befehle, die die Ausgabe erzeugen, weiterhin unter diesen Befehlen abgelegt werden müssen).
Eliah Kagan
8

Byobu ist ein großartiges Beispiel für etwas, das Sie niemals in eine setzen sollten .bashrc.

Andernfalls wird es rekursiv in jedem seiner virtuellen Terminals ausgeführt ;-)

Sie können es aber versuchen, es macht Spaß.

Das ist der Grund, warum Sie es .profileeingeben, damit byobu (das eigentlich nur ein Wrapper um den Bildschirm ist) nur einmal zum Zeitpunkt der Anmeldung geladen wird. Und byobu selbst kann neue interaktive Bash-Sessions starten.

Ralf
quelle
Das ist ein gutes Beispiel. Danke auch für den Hinweis auf Byobu. Jetzt probieren Sie es aus.
Don Faulkner