Frage Wählen Sie zwischen .bashrc, .profile, .bash_profile usw. [duplizieren]


Diese Frage hat hier bereits eine Antwort:

Das ist peinlich, aber nach vielen Jahren, in denen ich POSIX-Systeme in Vollzeit benutzt habe, fällt es mir immer noch schwer herauszufinden, ob eine Shell-Anpassung erfolgen sollte .bashrc, .profile, Oder irgendwo anders. Nicht zu vergessen einige der OS-spezifischen Konfigurationsdateien wie .pam_environment.

Ja, ich weiß, wie man durch die Dokumentation rätselt und erfährt, wenn jede Datei geladen ist oder nicht. Was ich mich wundere ist, wenn jemand alle umfassenden Richtlinien zusammengestellt hat, um zu entscheiden, in welcher Datei eine bestimmte Art von Anpassung vorgenommen werden soll.


169
2017-07-29 03:14


Ursprung


Diese Frage sollte nicht als doppelt markiert werden. Der Grund dafür ist, dass .profile in der hinzugefügten Frage nicht verfügbar ist. - Premraj
Antwort: serverfault.com/q/261802/270464 - Premraj


Antworten:


TL; DR:

  • ~/.bash_profile sollte super einfach sein und einfach laden .profile und .bashrc (in dieser Reihenfolge)

  • ~/.profile hat das Zeug NICHT speziell im Zusammenhang mit bash, wie Umweltvariablen (PATH und Freunde)

  • ~/.bashrc hat alles, was Sie an einer interaktiven Befehlszeile wünschen. Eingabeaufforderung, EDITOR Variable, Bash Aliase für meine Verwendung

Ein paar andere Anmerkungen:

  • Alles, was für grafische Anwendungen verfügbar sein soll ODER sh (oder bash aufgerufen als sh) MUSS drin sein ~/.profile

  • ~/.bashrc darf nichts ausgeben

  • Alles, was nur für Login-Shells verfügbar sein sollte, sollte reingehen ~/.profile

  • Sicher gehen, dass ~/.bash_login ist nicht vorhanden.


190
2017-07-29 04:27



+1, dies ermöglicht ~/.profile um die Umgebung für Dienste wie GDM / LightDM / LXDM richtig einzustellen, die explizit / bin / sh ausführen. - grawity
Meine .bashrc gibt eine Menge Zeug aus, kannst du das kommentieren? Insbesondere, wo sollte ich die Begrüßung ausgeben? - Calimo
@Calimo: Lass es nur Zeug im interaktiven Modus ausgeben. Sie können es mit testen [[ $- == *i* ]]das heißt, ich suche 'ich' im Besonderen $- Variable. Natürlich spielt es nur auf Systemen eine Rolle, auf denen bash zum Lesen kompiliert wird .bashrc im nicht interaktiven Modus. (Das heißt, Debian, aber nicht Arch.) Aber es ist eine häufige Ursache für mysteriöse Fehlermeldungen beim Verbindungsversuch mit sftp oder scp oder ähnliche Werkzeuge. - grawity
Jetzt muss ich wissen- warum sollte .bash_login nicht existieren? Was tut es? - tedder42
@ Tedder42: Es macht das gleiche wie .bash_profile und .profile. Aber bash liest nur das erste von drei. Bedeutung, wenn Sie eine haben .bash_logindann beides .profile und .bash_profile wird auf mysteriöse Weise ignoriert. - grawity


In den letzten Jahren hatte ich viel Zeit zu verlieren, also ich haben recherchiert dies für etwas mehr als nur 10 Minuten. Ich habe keine Ahnung, ob dies das beste Layout ist, es ist nur eines, das in fast allen Fällen korrekt funktioniert.

Die Anforderungen:

  • ~/.profile muss mit jedem / bin / sh kompatibel sein - das schließt bash, dash, ksh ein, was auch immer eine Distro benutzen mag.

  • Umgebungsvariablen müssen in eine Datei eingegeben werden, die von beiden Konsolen-Logins (d. H. Einer "Login" -Shell) und grafischen Logins (d. H. Display-Managern wie GDM, LightDM oder LXDM) gelesen wird.

  • Es hat sehr wenig Sinn zu haben beide  ~/.profile und ~/.bash_profile. Wenn letzteres fehlt, wird bash das erstere verwenden, und alle bash-spezifischen Zeilen können mit einem Check geschützt werden $BASH oder $BASH_VERSION.

  • Die Trennung zwischen *profile und *rc ist, dass ersteres für 'Login'-Shells verwendet wird und letzteres jedes Mal, wenn Sie ein Terminalfenster öffnen. Bash im "Login" -Modus wird jedoch nicht bereitgestellt ~/.bashrc, deshalb ~/.profile muss es manuell tun.

Das einfachste Konfiguration wäre:

  • Habe einen ~/.profile das setzt alle Umgebungsvariablen (außer Bash-spezifische), druckt vielleicht eine oder zwei Zeilen und dann Quellen ~/.bashrc wenn es von bash ausgeführt wird, bleibt es ansonsten bei der sh-kompatiblen Syntax.

    Export TZ = "Europa / Paris"
    exportieren EDITOR = "vim"
    if ["$ BASH"]; dann
        . ~ / .bashrc
    fi
    Betriebszeit
    
  • Habe einen ~/.bashrc Dies führt ein Shell-spezifisches Setup durch, das mit einem Check geschützt wird interaktiver Modus um zu vermeiden, Dinge wie zu brechen sftp auf Debian (wobei bash mit der Option zum Laden kompiliert wird) ~/.bashrcauch für nicht interaktive Shells):

    [[$ - == * i *]] || zurückgeben 0
    
    PS1 = '\ h \ w \ $'
    
    start () {sudo service "$ 1" start; }
    

Es gibt jedoch auch das Problem, dass bestimmte nicht interaktive Befehle (z. ssh <host> ls) überspringen ~/.profile, aber Umgebungsvariablen wären für sie sehr nützlich.

  • Bestimmte Distributionen (z. B. Debian) kompilieren ihre Bash mit der Option zum Quellen ~/.bashrc für solche nicht interaktiven Logins. In diesem Fall war es hilfreich, alle Umgebungsvariablen zu verschieben (die export ... Zeilen) in eine separate Datei, ~/.environund um es zu beziehen beide  .profile und .bashrc, mit einer Wache, um es zweimal zu vermeiden:

    ob ! ["$ PREFIX"]; dann # oder $ EDITOR oder $ TZ oder ...
        . ~ / .environ # Im Allgemeinen jede Variable, die .environ selbst setzen würde
    fi
    
  • Leider habe ich für andere Distributionen (z. B. Arch) keine sehr gute Lösung gefunden. Eine Möglichkeit besteht darin, das (standardmäßig aktivierte) PAM_ENV-PAM-Modul zu verwenden, indem Sie Folgendes eingeben ~/.pam_environment:

    BASH_ENV =. /. Environment # kein Tippfehler; es muss ein Pfad sein, aber ~ wird nicht funktionieren
    

    Dann natürlich Aktualisierung ~/.environ zu unset BASH_ENV.


Fazit? Muscheln sind ein Schmerz. Umgebungsvariablen sind ein Schmerz. Verteilungsspezifische Optionen für die Kompilierung sind ein immens Schmerzen im Arsch.


45
2017-07-29 15:28



+1 für den letzten Absatz, aber ich bevorzuge Sourcing .profile und .bashrc von .bash_profile und halten .profile reinigen. - nyuszika7h
@ nyuszika7h: Meine .profile  ist sauber, Vielen Dank. - grawity
Beachten Sie, dass der Kommentar jedes Mal, wenn Sie ein Fenster öffnen, für OSX umgekehrt ist - Mark
"Es hat wenig Sinn, beides zu haben ~/.profile und ~/.bash_profile"Ich bin nicht einverstanden. Sieh Dans Antwort nach dem Grund. - rubenvb
@rubenvb Können Sie den relevanten Teil zitieren? Ich denke, es ist in Ordnung, nur einen zu haben .profile und bewache die bashTeile mit Konditionalen. - Kelvin


Schau dir das an ausgezeichneter Blog-Beitrag von ShreevatsaR. Hier ist ein Auszug, aber gehen Sie zum Blog-Post, es enthält eine Erklärung für Begriffe wie "Login-Shell", ein Flussdiagramm und eine ähnliche Tabelle für Zsh.

Für Bash funktionieren sie wie folgt. Lesen Sie die entsprechende Spalte nach. Führt A, dann B, dann C usw. aus. B1, B2, B3 bedeutet, dass nur die erste der gefundenen Dateien ausgeführt wird.

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+

29
2017-07-29 03:39



Das ist nett. Es ist wichtig, dies in der Regel zu beachten /etc/profile Anrufe /etc/bash.bashrc, und ~/.profile Anrufe ~.bashrc. So effektiv, /etc/bash.bashrc und ~/.bashrc werden auch für interaktive Logins ausgeführt. - wisbucky
Beachten Sie, dass einige Distributionen dieses Schema zu überschreiben scheinen (mit seltsamen Konsequenzen) - siehe z. mein Bugreport zu opensuse hier: bugzilla.opensuse.org/show_bug.cgi?id=1078124 - Christian Herenz


Ich biete Ihnen meine "umfassenden" Richtlinien an:

  • Machen .bash_profile und .profile Belastung .bashrc wenn es existiert, wird z.B. [ -r $HOME/.bashrc ] && source $HOME/.bashrc
  • Setze alles andere hinein .bashrc.
  • Hör auf dir Sorgen zu machen.
  • Alle vier Jahre oder so, verbringen Sie zehn Minuten, um genau diese Frage zu recherchieren, bevor Sie aufgeben und zu "nicht sorgen" zurückkehren.

BEARBEITEN: Scare-Anführungszeichen zu "umfassend" hinzugefügt, für den Fall, dass jemand versucht ist, es zu glauben. ;)


19
2017-07-31 02:45



Beide haben .bash_profile und .profile ist ein bisschen überflüssig; Sie brauchen nur Letzteres. Sie müssen es jedoch machen / bin / sh-proof, wenn: if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fi, da es Programme gibt (nämlich gdm / lightdm), die die Datei manuell aus einem / bin / sh-Skript beziehen. Dies bedeutet auch, dass die Umwelt erhalten blieb .bashrc wäre unwirksam. Hatte bis -1, da Ihre "umfassenden" Richtlinien auf vielen Systemen nicht funktionieren werden, wie ich es mehrfach mühsam herausgefunden hatte. - grawity
Kein Problem, ich bezahle gerne eine -1 für eine Antwort, die nicht nur augenzwinkernd "umfassend" ist, und Sie haben diesen Titel sicherlich verdient. - Mechanical Fish


Ich gab es auf, diesen herauszufinden und machte ein Skript (~/.shell-setup) die ich von allen anderen bezahle.

Dieser Ansatz erfordert ~/.shell-setup um zwei Eigenschaften zu haben:

  1. Nur einmal ausführen, auch wenn sie wiederholt abgerufen wird (verwenden Sie Wächter einschließen)
  2. Erzeuge keine unerwünschte Ausgabe (erkenne, wenn die Ausgabe in Ordnung ist)

# 1 ist ziemlich Standard, obwohl vielleicht nicht viel in Shell-Skripten verwendet.

# 2 ist schwieriger. Hier ist, was ich in bash verwende:

if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
    echo "Hello user!" # ... etc
fi

Leider weiß ich nicht mehr, wie ich darauf gekommen bin oder warum Erkennen einer interaktiven Shell war nicht ausreichend.


0
2017-07-29 03:50





Setze alles rein .bashrc und dann Quelle .bashrc von .profile

Von der Bash-Manpage (unter OS X 10.9):

Wenn eine interaktive Shell gestartet wird, die keine Login-Shell ist, liest und führt bash Befehle von ~ / .bashrc aus, falls diese Datei existiert. Dies kann durch Verwendung der Option --norc verhindert werden. Die Option --rcfile file wird bash zwingen, Befehle aus der Datei anstatt ~ / .bashrc zu lesen und auszuführen

Der obige Text ist, warum alles hineingelegt wird .bashrc. Es gibt jedoch ein etwas anderes Verhalten, wenn Sie mit einer Login-Shell arbeiten. Nochmals, zitiert von der man-Seite:

Wenn bash als interaktive Login-Shell oder als nicht interaktive Shell mit der Option --login aufgerufen wird, liest und führt sie zuerst Befehle aus der Datei / etc / profile aus, falls diese Datei existiert. Nach dem Lesen dieser Datei sucht sie nach ~ / .bash_profile, ~ / .bash_login und ~ / .profile in dieser Reihenfolge und liest und führt Befehle aus der ersten aus, die existiert und lesbar ist. Die Option --noprofile kann verwendet werden, wenn die Shell gestartet wird, um dieses Verhalten zu verhindern.

.profile ist für Login-Shells gelesen, aber .bashrc ist nicht. Du hast das ganze Zeug kopiert .bashrc ist schlecht, also müssen wir es beschaffen .profile damit das Verhalten konsistent bleibt.

Sie möchten jedoch keine Quelle angeben .bashrc von .profile bedingungslos. Bitte beachten Sie die Kommentare und andere Antworten für weitere Details.


-1



-1, UNTERLASSEN SIE Quelle .bashrc von .profile. Siehe @ DanRabinowitz Antwort. - nyuszika7h
Zumindest nicht bedingungslos. - nyuszika7h
[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrc wäre ein süßer Oneliner für .profile. - John WH Smith
@ nyuszika7h, warum nicht? Jeder scheint vorschlagen, dies zu tun. - Pacerier