Konfigurationsdateien in Bash-Skripten laden mit `source`
February 20, 2015
Das Trennen von Konfiguration und Skriptlogik ist eine grundlegende Best Practice in der Softwareentwicklung. Anstatt Konfigurationswerte wie API-Schlüssel, Benutzernamen oder Pfade direkt in Ihr Skript zu schreiben, sollten diese in einer separaten Konfigurationsdatei ausgelagert werden.
In Bash wird dies mit dem source-Befehl (oder seinem POSIX-Äquivalent .) erreicht.
1. Erstellen der Konfigurationsdatei
Erstellen Sie eine Datei, die die Konfigurationsvariablen enthält. Es ist üblich, hierfür Dateiendungen wie .cfg, .conf oder einfach .sh zu verwenden.
Beispiel (config.cfg):
# Konfiguration für den API-Zugriff
API_ENDPOINT="https://api.example.com/v1"
API_KEY="DEIN_GEHEIMER_API_SCHLUESSEL"
Wichtiger Sicherheitshinweis: Fügen Sie Konfigurationsdateien, die sensible Daten enthalten, immer zu Ihrer .gitignore-Datei hinzu, um zu verhindern, dass sie versehentlich in ein Git-Repository committet werden.
2. Laden der Konfiguration im Skript
Verwenden Sie den source-Befehl, um die Konfigurationsdatei in Ihr Hauptskript zu laden. Dadurch werden die Variablen aus der Konfigurationsdatei im aktuellen Shell-Prozess verfügbar gemacht.
Beispiel (main.sh):
#!/usr/bin/env bash
set -euo pipefail
# Konfigurationsdatei laden
source "config.cfg"
# Die Variablen können nun verwendet werden
echo "Verbinde mit Endpunkt: $API_ENDPOINT"
echo "Verwende API-Schlüssel: ${API_KEY:0:4}..." # Nur die ersten Zeichen anzeigen
3. Ein robustes Lade-Muster (SCRIPT_DIR)
Wenn ein Skript aus einem anderen Verzeichnis aufgerufen wird, können relative Pfade wie source "config.cfg" fehlschlagen. Um dies zu verhindern, sollte der Pfad zur Konfigurationsdatei immer relativ zum Speicherort des Skripts selbst sein.
Dieses Muster stellt sicher, dass die Konfigurationsdatei immer gefunden wird, unabhängig davon, von wo aus das Skript aufgerufen wird.
Beispiel (main.sh):
#!/usr/bin/env bash
set -euo pipefail
# Ermittelt das Verzeichnis, in dem das Skript selbst liegt
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Pfad zur Konfigurationsdatei
CONFIG_FILE="${SCRIPT_DIR}/config.cfg"
# Überprüfen, ob die Konfigurationsdatei existiert
if [ ! -f "$CONFIG_FILE" ]; then
echo "Fehler: Konfigurationsdatei nicht gefunden unter: $CONFIG_FILE" >&2
exit 1
fi
# Konfigurationsdatei laden
source "$CONFIG_FILE"
echo "API-Endpunkt: $API_ENDPOINT"
"${BASH_SOURCE[0]}": Enthält den Pfad zum Skript.dirname: Extrahiert den Verzeichnispfad.cd ... && pwd: Wechselt in das Verzeichnis und gibt den absoluten Pfad zurück.
source vs. . (Punkt)
source: Ist ein Bash-spezifischer Alias..: Ist der ursprüngliche, POSIX-konforme Befehl.
Für maximale Portabilität in verschiedenen Shells (sh, zsh, etc.) ist die Verwendung des Punkt-Befehls vorzuziehen:
. "${SCRIPT_DIR}/config.cfg"
In reinen Bash-Skripten ist source jedoch oft lesbarer und wird häufiger verwendet.
Fazit
Das Auslagern von Konfigurationen in separate Dateien ist ein entscheidender Schritt zur Erstellung wartbarer und sicherer Bash-Skripte. Der source-Befehl, kombiniert mit dem SCRIPT_DIR-Muster, bietet eine robuste Methode, um diese Trennung zuverlässig umzusetzen.