linux-cli-shell shell configuration bash zsh dotfiles administration

Shell Config: .bashrc, .zshrc & .profile (Artikel 244)

Der ultimative Guide zur Shell-Initialisierung. Erfahren Sie den Unterschied zwischen Login- und interaktiven Shells und wie Sie Aliase und Pfade korrekt setzen.

# Shell Configuration: Ordnung im Dotfile-Dschungel

TL;DR / Management Summary “Warum ist mein Alias nach dem Einloggen nicht da?” Diese Frage stellt sich jeder Admin mindestens einmal. Die Antwort liegt in der Lade-Reihenfolge der Shell-Konfigurationsdateien. Es gibt einen massiven Unterschied, ob Sie sich per SSH einloggen (Login-Shell) oder einfach nur ein neues Terminal öffnen (Interactive Shell). In diesem Modul lernen wir, welche Datei wann geladen wird und wie wir Aliase und Pfade so setzen, dass sie immer verfügbar sind.


# 1. Einführung & Architektur

Login vs. Non-Login.

  • Login Shell: Wird beim ersten Einloggen (SSH, Konsole) gestartet. Liest /etc/profile und ~/.profile.
  • Interactive Non-Login Shell: Jedes weitere Terminal-Fenster. Liest ~/.bashrc oder ~/.zshrc.

# Der Lade-Fluss (Mermaid)

graph TD
    A[User Login: SSH] --> B[Login Shell]
    B --> C[/etc/profile]
    C --> D[~/.bash_profile / ~/.profile]
    D --> E[Check for ~/.bashrc]
    E --> F[Session Ready]
    
    G[New Terminal Window] --> H[Interactive Shell]
    H --> I[~/.bashrc / ~/.zshrc]
    I --> F

# 2. Die wichtigsten Dateien im Detail

Wo gehört was hin?

# 1. ~/.bashrc (oder ~/.zshrc)

Hier gehören alle Dinge rein, die die interaktive Nutzung betreffen.

  • Aliase (alias ll='ls -lh')
  • Custom Prompts (PS1)
  • Plugins

# 2. ~/.profile (oder ~/.bash_profile)

Hier gehören Dinge rein, die nur einmal pro Sitzung gesetzt werden müssen.

  • Exportieren von Umgebungsvariablen (export PATH=...)
  • API-Keys
  • Starten von Agenten (ssh-agent)

Best Practice: Damit Ihre .bashrc auch bei Logins geladen wird, fügen Sie folgendes zu Ihrer .profile hinzu: [[ -f ~/.bashrc ]] && . ~/.bashrc


# 3. Globale Konfiguration: /etc/

Standards für alle User.

Wenn Sie für das gesamte Team einen Standard-Pfad setzen wollen:

  • /etc/profile.d/*.sh: Legen Sie hier kleine Skripte ab. Jede Shell führt diese beim Starten aus. Das ist sauberer, als die Hauptdatei /etc/profile zu editieren.

# 4. Day-2 Operations: Dotfiles Management

Skalierbare Konfiguration.

Verwalten Sie Ihre Shell-Configs in Git.

  1. Erstellen Sie ein Repo dotfiles.
  2. Nutzen Sie Symlinks, um die Dateien im Home-Verzeichnis zu verlinken.
  3. So haben Sie auf jedem neuen Server sofort Ihre gewohnte Umgebung.

# 5. Troubleshooting & “War Stories”

Wenn die Shell hakt.

# Story 1: “Der Pfad-Teufel”

Symptom: In der SSH-Sitzung funktioniert ein Befehl, aber in einem Cronjob schlägt er mit command not found fehl. Ursache: Cronjobs laden keine Profile. Sie haben einen minimalen $PATH. Lösung: Nutzen Sie in Cronjobs immer absolute Pfade (/usr/bin/mytool) oder definieren Sie den Pfad am Anfang des Skripts explizit.

# Story 2: “Recursive Source Death”

Symptom: Das Einloggen dauert ewig, und der Server meldet irgendwann “Too many open files”. Ursache: Die .bashrc sourced die .profile, die wiederum die .bashrc sourced. Eine Endlosschleife. Lösung: Trennen Sie die Logik strikt. .profile sollte nur Variablen setzen und .bashrc rufen, niemals umgekehrt.


# 6. Fazit & Empfehlung

  • Pfade: Setzen Sie $PATH Erweiterungen immer in der .profile.
  • Aliase: Setzen Sie Aliase in die .bashrc / .zshrc.
  • Kommentare: Dokumentieren Sie in den Dateien, warum Sie eine Variable gesetzt haben. Nach einem Jahr wissen Sie es sonst nicht mehr.

# Anhang: Cheatsheet

Shell Login-Dateien Interactive-Dateien
Bash /etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profile ~/.bashrc
Zsh /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zlogin, ~/.zlogin ~/.zshrc
Fish ~/.config/fish/config.fish ~/.config/fish/config.fish
Shell-Typ prüfen echo $0 echo $SHELL
Neu laden source ~/.bashrc exec $SHELL (sauberer)