shell dotfiles und * rcs: Was ist eine vernünftige Einstellung?

842
kch

Ein bash Benutzer wird schließlich am Ende mit .bashrc, .bash_profile, .profile, und vielleicht noch einige mehr.

Jetzt wird jede Datei in bestimmten Situationen geladen, und dies führt zu Verwirrung und Frustration. Es ist mir egal, welche Shell eine Login-Shell ist und Sie sollten es auch nicht.

Ich möchte nur sicherstellen, dass für jede Shell-Sache, die passiert, dasselbe geladen wird.

Was ist der vernünftigste Weg, um sie einzurichten?

Ich würde wetten, dass nicht bash-spezifische Dinge in .profileund einige Dateiquellen die anderen usw. sind. Was genau würde in jede einfügen, um eine identische Umgebung für jede Shell zu erreichen?

Hinweis: Ich frage nicht, was Sie besonders gerne in Ihre RC-Dateien einfügen, wie zum Beispiel Aliasnamen und Funktionen. Nur, wie Sie sie so auslegen, dass die Dinge nicht zufällig miteinander verbunden werden.

4
Ich habe dieses großartige Buch, From Bash bis Z Shell, und ich wusste genau, wie man aus der Shell-Initialisierungs-Hölle herauskommt, aber es ist alles unordentlich und zufällig und ich kann mich nicht an Dinge erinnern, die es nicht tun Sinn ergeben. kch vor 15 Jahren 0
Wenn einige Befehle jedoch in einer Shell ohne Shell ausgeführt werden, kann dies die Anmeldung bei diesem Konto unmöglich machen. Kent Fredric vor 15 Jahren 0
Ich würde ein Beispiel lieben. Ich bin mir jedoch sicher, dass es in diesem Fall in der entsprechenden Datei weggelassen werden kann, um nicht ausgeführt zu werden, wenn dies nicht der Fall ist. kch vor 15 Jahren 1
Ein Beispiel wäre ein Problem mit rsync: http://www.samba.org/rsync/FAQ.html#3 innaM vor 15 Jahren 0

2 Antworten auf die Frage

4
Ludwig Weinzierl

Ich möchte nur sicherstellen, dass für jede Shell-Sache, die passiert, dasselbe geladen wird.

Wenn du das wirklich willst, ~/.profilefüge alles ein und füge source ~/.profileam Ende deines ein ~/.bashrc. Ob dies wünschenswert ist, ist eine andere Frage. Zur Quelle ~/.profilein ~/.bashrcist eine sehr häufige Setup trotzdem.

+ ------------ + ----------------- + ------------------ - + | | Login-Shells | interaktive Schalen | + ------------ + ----------------- + ------------------ - | | alle | / etc / profile | | | Bourneish | ---------------- + -------------------- | | Muscheln | ~ / .profile | | + ------------ + ----------------- + ------------------ - | | nur | ~ / .bash-Profil | /etc/bash.bashrc | | | --------------------------------- | | bash | ~ / .bash-login | ~ / .bashrc | + ------------ + ----------------- + ------------------ - + 

Abgeleitete C-Shell und -Shells verwenden andere Dateien (.login, .cshrc, ..).

Was genau wäre in jedem, um eine identische Umgebung für jede Shell zu erreichen?

Wenn Sie Umgebung im Sinne von Umgebungsvariablen meinen, setzen Sie einfach alle in ~ / .profile und Sie sind in Ordnung. Wenn Sie Umwelt im weiteren Sinne meinen, hängt es davon ab.

Das Problem hierbei ist, dass es nicht wünschenswert ist, dieselbe Umgebung für interaktive und Login-Shells zu haben. Ein Beispiel sind Aliase: Möglicherweise möchten Sie Aliase in Ihrer interaktiven Shell, aber sehr wahrscheinlich werden sie dazu führen, dass Ihre Skripts seltsame Dinge tun. Sie möchten also nicht, dass Ihre Aliase in nicht interaktiven Shells sind => ~./bashrc.

Ich verstehe, dass .profile auch von sh geladen wird, während .bash_profile nur von bash geladen wird. Sie sollten also keine Dinge in bash in .profile einfügen, die nur in bash funktionieren. Ich setze also die meisten Dinge in .profile, einige in .bashrc und beide in .bash_profile ein. Macht Sinn? kch vor 15 Jahren 0
Obwohl diese Antwort nicht direkt hilft, hat sie mich dazu inspiriert, "wie wäre es mit einer unsinnigen Datei wie ~ / .my_shell_conf zu machen und sie dann einfach von Ihren verschiedenen Shell-Skripts zu beziehen, wo es sinnvoll ist." Kent Fredric vor 15 Jahren 0
@ksh: Macht absolut Sinn. Ludwig Weinzierl vor 15 Jahren 0
@Kent Frederic: Ich stimme zu, aber ich denke, du würdest letztendlich deine ~ / .my_shell dort beschaffen, wo ich ~ / .profile aufrufe. Ludwig Weinzierl vor 15 Jahren 0
C-Shells lesen auch ~ / .cshrc-Dateien. Jonathan Leffler vor 15 Jahren 1
@ Jonathan Leffler: Antwort aktualisiert. Ludwig Weinzierl vor 15 Jahren 0
0
Jonathan Leffler

Ich repariere die Dinge so, dass fast alle meine Einstellungen von der Login-Shell und fast nichts von der Per-Shell-Basis ausgeführt werden. Das heißt, meine .profileDatei ist komplex. Meine .kshrcDatei (analog .bashrczu Bash und .cshrcC-Shell) ist nicht vorhanden. Ich habe das nie als Problem empfunden. Das bedeutet auch, dass Shells ohne Login schnell wie möglich sind - sie suchen nicht nach Dateien, um Befehle zu analysieren, die sie nicht verwenden. Dies könnte ein Kater aus den Tagen der Bourne-Shell sein - wenn die Per-Shell-Skripts nicht vorhanden waren. Ich habe jedoch nie etwas gefunden, das eine solche spezialisierte Behandlung erfordert.