TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

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.

code
gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings

Die Ausgabe ist ein String, der eine Array-ähnliche Struktur hat:

code
['/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.

code
# 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.

code
#!/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.