Diese Frage hat hier bereits eine Antwort:
- Unterschied zwischen .bashrc und .bash_profile 6 Antworten
Das ist peinlich, aber nach vielen Jahren der POSIX - Systemen voll in Betrieb nehmen , ich habe noch eine harte Zeit , herauszufinden , ob eine Shell - Anpassung in gehen sollte .bashrc
, .profile
oder irgendwo anders. Ganz zu schweigen von einigen betriebssystemspezifischen Konfigurationsdateien wie .pam_environment
.
Ja, ich kann durch die Dokumentation rätseln und lernen, wann jede Datei geladen ist oder nicht. Ich frage mich, ob jemand umfassende Richtlinien zusammengestellt hat, um zu entscheiden, in welche Datei eine bestimmte Art von Anpassung eingefügt werden soll.
Antworten:
TL; DR:
~/.bash_profile
sollte super einfach sein und nur laden.profile
und.bashrc
(in dieser Reihenfolge)~/.profile
Hat das Zeug NICHT speziell mit Bash zu tun, wie Umgebungsvariablen (PATH
und Freunde)~/.bashrc
hat alles, was Sie an einer interaktiven Befehlszeile wollen. Eingabeaufforderung,EDITOR
Variable, Bash-Aliase für meine VerwendungEin paar andere Anmerkungen:
Alles, was für grafische Anwendungen verfügbar sein oder als sh (oder bash aufgerufen werden soll
sh
), MUSS enthalten sein~/.profile
~/.bashrc
darf nichts ausgebenAlles, was nur für Login-Shells verfügbar sein sollte, sollte rein
~/.profile
Stellen Sie sicher, dass
~/.bash_login
das nicht vorhanden ist.quelle
~/.profile
die korrekte Einstellung der Umgebung für Dienste wie GDM / LightDM / LXDM, die explizit / bin / sh ausführen..bashrc
Ausgaben ziemlich viel Zeug, kannst du das kommentieren? Wo soll ich die Begrüßungsausgabe platzieren?[[ $- == *i* ]]
in der speziellen$-
Variablen nach 'i' suchen . Auf Systemen, auf denen bash kompiliert wurde, um.bashrc
im nicht interaktiven Modus zu lesen, ist dies natürlich nur von Bedeutung . (Das heißt, Debian , aber nicht Arch.) Aber es ist eine häufige Ursache für mysteriöse Fehlermeldungen bei der Verwendung zu versuchen , eine Verbindungsftp
oderscp
oder ähnliche Werkzeuge..bash_profile
und.profile
. Aber bash liest nur den ersten von drei. Das heißt, wenn Sie eine haben.bash_login
, dann werden beide.profile
und.bash_profile
auf mysteriöse Weise ignoriert.In den letzten Jahren hatte ich viel Zeit zu verschwenden und habe dies für etwas mehr als nur 10 Minuten recherchiert. Ich habe keine Ahnung, ob dies das beste Layout ist, es ist nur eines, das in fast allen Fällen richtig funktioniert.
Die Anforderungen:
~/.profile
muss mit jedem / bin / sh kompatibel sein - dies schließt bash, dash, ksh und alles andere ein, was eine Distribution sonst noch verwenden möchte.Umgebungsvariablen müssen in einer Datei abgelegt werden, die sowohl von Konsolenanmeldungen (dh einer 'Login'-Shell) als auch von grafischen Anmeldungen (dh Display-Managern wie GDM, LightDM oder LXDM) gelesen wird.
Es gibt sehr wenig Sinn, die beide
~/.profile
und~/.bash_profile
. Wenn letzteres fehlt, verwendet bash gerne das erstere, und alle bashspezifischen Zeilen können mit einem Check für$BASH
oder geschützt werden$BASH_VERSION
.Die Trennung zwischen
*profile
und*rc
besteht darin, dass ersteres für 'Login'-Shells verwendet wird und letzteres jedes Mal, wenn Sie ein Terminalfenster öffnen. Bash im Anmeldemodus wird jedoch nicht als Quelle verwendet~/.bashrc
und muss daher~/.profile
manuell ausgeführt werden.Die einfachste Konfiguration wäre:
Haben Sie ein
~/.profile
, das alle Umgebungsvariablen (außer bash-spezifischen) festlegt, vielleicht ein oder zwei Zeilen ausgibt, dann Quellen,~/.bashrc
wenn es von bash ausgeführt wird, und ansonsten die sh-kompatible Syntax beibehalten.Haben Sie eine
~/.bashrc
, die alle Shell-spezifischen Setups ausführt, mit einer Prüfung für den interaktiven Modus , um zu vermeiden, dass Dinge wiesftp
unter Debian beschädigt werden (wobei Bash mit der Option kompiliert wird,~/.bashrc
auch für nicht interaktive Shells zu laden ):Es gibt jedoch auch das Problem, dass bestimmte nicht interaktive Befehle (z. B.
ssh <host> ls
) übersprungen werden~/.profile
, aber Umgebungsvariablen für sie sehr nützlich wären.Bestimmte Distributionen (z. B. Debian) kompilieren ihre Bash mit der Option, Quellen
~/.bashrc
für solche nicht interaktiven Logins anzugeben. In diesem Fall hat es sich als nützlich erwiesen, alle Umgebungsvariablen (dieexport ...
Zeilen) in eine separate Datei zu verschieben~/.environ
und aus beiden Quellen.profile
und.bashrc
mit einem Schutz zu extrahieren, um zu vermeiden, dass dies zweimal geschieht:Leider habe ich für andere Distributionen (zB Arch) keine sehr gute Lösung gefunden. Eine Möglichkeit besteht darin, das (standardmäßig aktivierte) PAM-Modul pam_env zu verwenden, indem Sie Folgendes eingeben
~/.pam_environment
:Dann natürlich aktualisieren
~/.environ
aufunset BASH_ENV
.Fazit? Muscheln sind ein Schmerz. Umgebungsvariablen sind ein Schmerz. Distributionsspezifische Optionen zur Kompilierungszeit sind ein großes Ärgernis.
quelle
.profile
und.bashrc
von.bash_profile
und.profile
sauber zu halten ..profile
ist sauber , danke.~/.profile
und~/.bash_profile
": Ich bin anderer Meinung. Siehe Dans Antwort für das Warum..profile
und diebash
-spezifischen Teile mit Auflagen zu bewachen .Schauen Sie sich diesen ausgezeichneten Blog-Beitrag von ShreevatsaR an . Hier ist ein Auszug, aber gehen Sie zum Blog-Beitrag, der eine Erklärung für Begriffe wie "Login-Shell", ein Flussdiagramm und eine ähnliche Tabelle für Zsh enthält.
quelle
/etc/profile
Anrufe/etc/bash.bashrc
und~/.profile
Anrufe~.bashrc
. So effektiv/etc/bash.bashrc
und~/.bashrc
werden auch für Interactive Logins ausgeführt./bin/sh
BASH_ENV
). Der zugehörige Absatz der Bash-Manpage kann durch Suchen nach gefunden werdenIf bash is invoked with the name sh
.Ich biete Ihnen meine "umfassenden" Richtlinien an:
.bash_profile
und.profile
laden.bashrc
Sie, wenn es existiert, mit z[ -r $HOME/.bashrc ] && source $HOME/.bashrc
.bashrc
.BEARBEITEN: Erschreckende Anführungszeichen zu "umfassend" hinzugefügt, nur für den Fall, dass jemand versucht ist, es zu glauben. ;)
quelle
.bash_profile
und.profile
ist ein bisschen überflüssig; du brauchst nur letzteres. Sie müssen es jedoch / bin / sh-proof machen,if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fi
da es Programme (nämlich gdm / lightdm) gibt, die die Datei manuell aus einem / bin / sh-Skript beziehen. Dies bedeutet auch, dass die Umgebung, in.bashrc
der wir uns befinden, unwirksam wäre. Musste -1, da deine "umfassenden" Richtlinien auf vielen Systemen nicht funktionieren, wie ich mehrmals auf die harte Tour herausgefunden hatte.Ich habe es aufgegeben, dies herauszufinden und ein Skript (
~/.shell-setup
) erstellt, das ich von allen anderen Quellen beziehe.Dieser Ansatz erfordert
~/.shell-setup
zwei Funktionen:# 1 ist ein ziemlich normaler Standard, obwohl er in Shell-Skripten möglicherweise nicht häufig verwendet wird.
# 2 ist schwieriger. Folgendes verwende ich in bash:
Leider kann ich mich nicht erinnern, wie ich darauf gekommen bin oder warum das Erkennen einer interaktiven Shell nicht ausreichte.
quelle
Setzen Sie alles in
.bashrc
und dann Quelle.bashrc
aus.profile
Von der Bash-Manpage (unter OS X 10.9):
Der obige Text ist, warum alles eingegeben wird
.bashrc
. Es gibt jedoch ein etwas anderes Verhalten, wenn Sie mit einer Anmeldeshell arbeiten. Nochmals ein Zitat aus der Manpage:.profile
wird für Login-Shells gelesen, ist es aber.bashrc
nicht. Das Duplizieren all dieser Inhalte.bashrc
ist schlecht, so dass wir sie als Quelle verwenden.profile
müssen, damit das Verhalten konsistent bleibt.Sie möchten jedoch nicht unbedingt
.bashrc
von.profile
beziehen. Weitere Informationen finden Sie in den Kommentaren und anderen Antworten.quelle
.bashrc
von.profile
. Siehe @ DanRabinowitz Antwort.[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrc
wäre ein süßer oneliner für.profile
.