Duplikatfreies Hinzufügen zu dconf-Listen per Bash-Skript
August 9, 2020
dconf ist ein Konfigurationssystem, das von GNOME und anderen Desktop-Umgebungen verwendet wird, um Benutzereinstellungen zu speichern. Viele dieser Einstellungen, wie z.B. benutzerdefinierte Tastenkürzel (custom-keybindings), werden als Listen von Strings gespeichert. Beim Skripten von Konfigurationsänderungen entsteht oft das Problem, einen neuen Eintrag zu einer solchen Liste hinzuzufügen, ohne dabei Duplikate zu erzeugen, falls der Eintrag bereits existiert.
Diese Anleitung zeigt eine robuste, idempotente Methode, dies mit einem Bash-Skript zu erreichen.
1. Aktuelle dconf-Liste auslesen
Zuerst lesen Sie den aktuellen Wert des dconf-Schlüssels mit dem gsettings-Kommandozeilen-Tool aus.
gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings
Die Ausgabe ist ein String, der eine Array-ähnliche Struktur hat:
['/path/to/keybinding/custom0/', '/path/to/keybinding/custom1/']
2. Eintrag hinzufügen (nur wenn nicht vorhanden)
Die folgende Methode kombiniert das Lesen, Überprüfen und Schreiben in einem Einzeiler.
# Der neue Wert, der hinzugefügt werden soll
NEW_ENTRY="'/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/'"
# Der dconf-Schlüssel
DCONF_KEY="org.gnome.settings-daemon.plugins.media-keys custom-keybindings"
# Aktuelle Liste auslesen
CURRENT_LIST=$(gsettings get $DCONF_KEY)
# Prüfen, ob der Eintrag bereits existiert. Wenn nicht, hinzufügen.
if ! echo "$CURRENT_LIST" | grep -q "$NEW_ENTRY"; then
# String-Manipulation: Entfernt die schließende Klammer ']' und fügt den neuen Eintrag an.
UPDATED_LIST="${CURRENT_LIST%]*}, $NEW_ENTRY]"
gsettings set $DCONF_KEY "$UPDATED_LIST"
fi
Erklärung der String-Manipulation:
"${CURRENT_LIST%]*}": Dies ist eine Bash-Parameter-Expansion. Sie entfernt das kürzeste passende Muster von rechts. Hier wird]entfernt.- Danach wird
, $NEW_ENTRY]angehängt, um die Liste zu vervollständigen.
3. Wiederverwendbare Bash-Funktion
Für den Einsatz in Automatisierungsskripten ist es sinnvoll, diese Logik in eine wiederverwendbare Funktion zu kapseln.
#!/usr/bin/env bash
# Fuegt einen Wert zu einem dconf-Schlüssel hinzu, falls er noch nicht existiert.
#
# @param {string} key - Der vollständige dconf-Schlüssel (z.B. "org.gnome.desktop.interface enabled-extensions").
# @param {string} value - Der hinzuzufügende Wert (bereits in Anführungszeichen, falls erforderlich).
#
# Beispiel:
# append_to_dconf_list \
# "org.gnome.settings-daemon.plugins.media-keys custom-keybindings" \
# "'/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/'"
append_to_dconf_list() {
local dconf_key="$1"
local new_value="$2"
local current_list
current_list=$(gsettings get $dconf_key)
# Wenn die Liste den Wert bereits enthält, wird nichts getan (Idempotenz)
if echo "$current_list" | grep -qF "$new_value"; then
echo "Eintrag '$new_value' existiert bereits."
return 0
fi
# Baut die neue Liste zusammen
local updated_list="${current_list%]*}, $new_value]"
echo "Füge Eintrag hinzu: $new_value"
gsettings set "$dconf_key" "$updated_list"
}
# Beispielaufruf
append_to_dconf_list \
"org.gnome.settings-daemon.plugins.media-keys custom-keybindings" \
"'/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom99/'"
Diese Funktion ist idempotent, d.h. sie kann mehrfach ausgeführt werden, ohne unerwünschte Nebeneffekte (wie Duplikate) zu erzeugen.
Fazit
Obwohl gsettings keine native "append-unique"-Operation bietet, lässt sich diese Funktionalität mit einfachen Bash-Mitteln und String-Manipulation zuverlässig nachbilden. Dies ist besonders nützlich für die Erstellung von Skripten zur automatisierten Konfiguration von GNOME-basierten Desktop-Umgebungen.