Zum Inhalt springen

XDG-Verzeichnisse

Aus wiki.archlinux.de

Dieser Artikel behandelt die durch die XDG Base Directory Specification spezifizierten Verzeichnisse, deren Konfiguration, Definition, und Verwendung, sowie die aus dieser Spezifikation abgeleiteten useraccountspezifischen Verzeichnisse.

Installation

Zur Verwaltung der XDG-Verzeichnisse muss kein spezielles Programm installiert werden, die Konfiguration der Base Directorys wird vollständig durch Umgebungsvariablen vorgenommen. Die Konfiguration der User Directorys erfolgt in einer einfachen Datei. Die Spezifikation wird also aus Administratoren- und Anwendersicht nicht implementiert sondern lediglich durch Konfiguration umgesetzt.

Aus Gründen der Einfachheit kann man für die der Verwaltung der User Directorys das Programm xdg-user-dirs-update benutzen. Auf den meisten Systemen wird dies aber schon bereits durch Abhängigkeiten installiert worden sein. xdg-user-dirs-update ist als xdg-user-dirs in extra verfügbar, und kann von dort mittels Pacman installiert werden.

pacman -S xdg-user-dirs

Es wird bei der installation automatisch ein passender systemd-Service installiert und aktiviert, der bei jedem Login die Konfiguration überprüft und gegebenenfalls fehlende Verzeichnisse erstellt.

Base Directorys

Hinweis: Die Variable XDG_RUNTIME_DIR für nicht-essentielle Laufzeitdateien wird unter Arch Linux automatisch durch pam_systemd gesetzt und wie benötigt konfiguriert, und sollte auch nicht geändert werden, da es sonst unter anderem mit pipewire zu Problemen kommt und und z.B. in Chromium das Screensharing nicht mehr funktioniert.

Die XDG Base Directory Specification definiert mehrere Standard-Verzeichnisse für verschiedene Aufgaben. Man sollte die entsprechenden Variablen setzen, und auf den „Ziel“-Pfad verweisen lassen.

Variable Ziel Verwendung
XDG_CACHE_HOME $HOME/.cache Nicht-essentielle Cache-Dateien
XDG_CONFIG_HOME $HOME/.config Konfigurationsdateien
XDG_DATA_HOME $HOME/.local/share Architekturunabhängige Datendateien
XDG_STATE_HOME $HOME/.local/state Persistente Zustandsdateien

Zudem gibt es noch zwei weitere Variablen, die nicht auf die jeweiligen Homes verweisen, sondern wie PATH eine Liste von Verzeichnissen mit absteigender Priorität beinhalten

Variable Ziel Verwendung
XDG_CONFIG_DIRS /etc/xdg Systemweite Konfigurationsdateien
XDG_DATA_DIRS /usr/local/share:/usr/share Systemweite Datendateiverzeichnisse

Einige Programme ignorieren die Variablen und nutzen die angegebenen Ziel-Pfade direkt. Andere Programme lassen sch entsprechend konfigurieren.

Setzen

Da die Base Directorys per Umgebungsvariablen dem System bekannt gegeben werden, kann man die Definitionen wie alle anderen Variablen auch, entweder useraccountbezogen oder Systemweit in entsprechende Konfigurationsdateien schreiben.

Für eine systemweite Konfiguration kann man zum Beispiel die Variablen durch PAM beim Anmelden setzen lassen. Die Variable @{HOME} bezieht sich dabei auf das in /etc/passwd für den Useraccount hinterlegte Homeverzeichnis, und nicht die Umgebungsvariable HOME.

/etc/security/pam_env.conf
XDG_CACHE_HOME  DEFAULT=@{HOME}/.cache
XDG_CONFIG_HOME DEFAULT=@{HOME}/.config
XDG_DATA_HOME   DEFAULT=@{HOME}/.local/share
XDG_STATE_HOME  DEFAULT=@{HOME}/.local/state

XDG_CONFIG_DIRS DEFAULT=/etc/xdg
XDG_DATA_DIRS   DEFAULT=/usr/local/share:/usr/share

Will man die Konfiguration der Variablen erzwingen, und bestehende Konfiguration bei der Authentifizierung mittels PAM überschreiben, so kann man statt DEFAULT= die Definition OVERRIDE= verwenden.

Auch besteht die Möglichkeit, die Konfiguration zum Beispiel in /etc/profile.d/ zu hinterlegen.

/etc/profile.d/xdg-base-dirs.sh
# Base Directorys setzen, wenn nicht bereits gesetzt
#
# Der Doppelpunkt ist ein no-op-Parameter, der dafür sorgt, dass
# kein Fehlercode zurückgegeben wird. Die Variablenzuordnung setzt
# die Variable nur dann, wenn die Variable nicht schon existiert.
#
# Die Variable XDG_RUNTIME_DIR wird ausgelassen, da die unter Arch
# Automatisch gesetzt wird.
: ${XDG_CACHE_HOME="$HOME/.cache"}
: ${XDG_CONFIG_HOME="$HOME/.config"}
: ${XDG_DATA_HOME="$HOME/.local/share"}
: ${XDG_STATE_HOME="$HOME/.local/state"}

: ${XDG_CONFIG_DIRS="/etc/xdg"}
: ${XDG_DATA_DIRS="/usr/local/share:/usr/share"}

# Die Variablen Exportieren
export XDG_CACHE_HOME
export XDG_CONFIG_HOME
export XDG_DATA_HOME
export XDG_STATE_HOME

export XDG_CONFIG_DIRS
export XDG_DATA_DIRS

Selbstverständlich kann man die Variablen auch useraccountbezogen definieren, zum Beispiel bei Verwendung der Bash durch simples Exportieren in der .bashrc.

$HOME/.bashrc
export XDG_CACHE_HOME="$HOME/.cache"
export XDG_CONFIG_HOME="$HOME/.config"
[weiter Konfiguration]

Es ist dabei zu beachten, dass verschiedene Shells verschiedene Konfigurationsdateien nicht immer alle überall ausführen, und so die Konfiguration der Base Directorys nicht immer als gegeben Vorausgesetzt werden kann. Es sei auf die Dokumentation der verwendeten Shell verwiesen.

Da es sich um normale Umgebungsvariablen handelt, kann man diese auch einem Programmaufruf voranstellen.

XDG_CONFIG_HOME="$HOME/.config meinprogramm

Sofern meinprogramm dies unterstützt, wird die Variable wie angegeben benutzt, anstatt den zuvor vergebenen Wert zu benutzen.

Verwenden

Da die konfigurierten Base Directorys als Umgebungsvariablen im System vorliegen, kann man diese einfach verwenden, und zum Beispiel ausgeben.

% echo $XDG_CONFIG_HOME
/home/user/.config

% env | grep XDG_DATA_HOME
XDG_DATA_HOME=/home/user/.local/share

[usw.]

Es empfiehlt sich bei Verwendung der Variablen in eigenen Scripten und Programmen als Fallback den in der Spezifikation genannten Pfad zu verwenden.

${XDG_CONFIG_HOME:-$HOME/.config}/meinprogramm

Diese POSIX-konforme Parameter Expansion stellt sicher, dass entweder $XDG_CONFIG_HOME/meinprogramm oder der Pfad $HOME/.config/meinprogramm benutzt wird.

User Directorys

Anzeige der lokalisierten XDG-Verzeichnisse mit angepasstem Icon in Thunar

Aus der XDG Base Directory Specification heraus haben sich diverse weitere XDG-Verzeichnisse etabliert, die allgemein anerkannt werden.

Bei Verwendung von xdg-user-dirs-update werden die Verzeichnisse automatisch lokalisiert, und verweisen dann auf „Dokumente“, „Öffentlich“, „Vorlagen“, etc. Auch einige Dateimanager zeigen die die konfigurierten Pfade mit angepassten Icons an, oder bieten Shortcuts um direkt zu den Verzeichnissen zu wechseln. Wenn unterstützt, werden auch Desktopicons automatisch angezeigt.

Name Ziel Verwendung
XDG_DESKTOP_DIR $HOME/Desktop Icons auf dem Desktop
XDG_DOCUMENTS_DIR $HOME/Documents Dokumente aus Office-Programmen
XDG_DOWNLOAD_DIR $HOME/Downloads Speicherziel aus dem Browser heraus
XDG_MUSIC_DIR $HOME/Music Musikdateien
XDG_PICTURES_DIR $HOME/Pictures Bilddateien
XDG_PUBLICSHARE_DIR $HOME/Public Öffentlich geteilte Daten
XDG_TEMPLATES_DIR $HOME/Templates Vorlagen für z.B. Neue-Datei-Menüs
XDG_VIDEOS_DIR $HOME/Videos Videodateien

Die meisten Programme respektieren die entsprechende Konfiguration und legen die Verzeichnisse teilweise auch an, wenn sie nicht existieren, bzw. nutzen den allgemein anerkannten Zielpfad, wenn die Definition nicht gefunden werden kann.

Will man die Verzeichnisse nicht verwenden, sollte man die Konfiguration dennoch anlegen und entsprechend auf $HOME verweisen lassen. Da dies schon existiert, wird durch Programme nicht ungewollt ein Verzeichnis angelegt.

Konfiguration

Aufgrund der hohen Verbreitung und allgemeinen Akzeptanz ist der gängige Weg der Konfiguration der XDG-Verzeichnisse xdg-user-dirs-update aus dem Paket xdg-user-dirs. Dies wird automatisch ausgeführt, und erstellt wenn nötig die entsprechenden XDG-Verzeichnisse basierend auf der Konfiguration. Standardmäßig werden die Verzeichnisse anhand der Locale benannt.

Sofern keine useraccountbezogene Konfiguration besteht, wird auf die systemweite Konfiguration in den Dateien /etc/xdg/user-dirs.conf und /etc/xdg/user-dirs.defaults zurückgegriffen. Die systemweiten Dateien sind eindeutig Kommentiert, die systemweite Konfiguration unterscheidet sich von der useraccountbezogenen Konfiguration.

Die Konfiguration von xdg-user-dirs-update findet useraccountbezogen in den Dateien $XDG_CONFIG_HOME/user-dirs.dirs und $XDG_CONFIG_HOME/user-dirs.locale statt. Wenn $XDG_CONFIG_HOME nicht definiert ist, wird $HOME/.config benutzt.

$XDG_CONFIG_HOME/user-dirs.dirs
XDG_DESKTOP_DIR="$HOME/"
XDG_DOWNLOAD_DIR="$HOME/"
XDG_TEMPLATES_DIR="$HOME/Dokumente/Vorlagen"
XDG_PUBLICSHARE_DIR="/public/$USER"
XDG_DOCUMENTS_DIR="$HOME/Arbeit"
XDG_MUSIC_DIR="/media/server/Musiksammlung"
XDG_PICTURES_DIR="/media/server/Bilder"
XDG_VIDEOS_DIR="$HOME/Videosclips"

Diese Beispielkonfiguration setzt $XDG_DESKTOP_DIR und $XDG_DOWNLOAD_DIR beide auf $HOME, damit durch Programme nicht „irgendwelche Verzeichnisse“ erstellt werden. Die anderen Verzeichnisse werden unterschiedlich spezifisch definiert.

Bei einem einfachen Ausführen von xdg-user-dirs-update wird die Datei eingelesen und die Verzeichnisse werden entsprechend erstellt, falls sie nicht existieren sollten. Zudem können Programme, die der Spezifikation folgen, die Verzeichnisse auslesen.

Will man die systemweit definierten Verzeichnisse verwenden, so kann man ein Überschreiben der Konfiguration erzwingen.

xdg-user-dirs-update --force
Moving DESKTOP directory from  to Schreibtisch
Moving DOWNLOAD directory from  to Downloads
Moving TEMPLATES directory from Dokumente/Vorlagen to Vorlagen
Moving PUBLICSHARE directory from /public/user to Öffentlich
Moving DOCUMENTS directory from Arbeit to Dokumente
Moving MUSIC directory from /media/server/Musiksammlung to Musik
Moving PICTURES directory from /media/server/Bilder to Bilder
Moving VIDEOS directory from Videosclips to Videos

Es besteht zudem die Möglichkeit, gezielt einzelne Verzeichnisse zu setzen.

xdg-user-dirs-update --set VIDEOS $HOME/Videosammlung

Dies passt, wie alle anderen Aufrufe auch, nur die Konfiguration an.

$XDG_CONFIG_HOME/user-dirs.dirs
[weitere]
XDG_VIDEOS_DIR="$HOME/Videosammlung"

Die Dateien muss man selbst nachträglich in das Verzeichnis verschieben.

Auslesen

Achtung: Die Parameter für xdg-user-dir in eigenen Scripts und Programmen sollten Hardcoded oder sehr streng Sanitized sein, da das Tool den Parameter an eval übergibt und dadurch prinzipiell beliebiger Code im Usercontext ausgeführt werden könnte!

Die User Directorys werden, anders als die Base Directorys nicht als Umgebungsvariablen abgebildet, und von Programmen die die Spezifikation unterstützen auch nicht aus diesen heraus ausgelesen, sondern immer nur über die entsprechende Konfigurationsdatei.

Das Auslesen der Verzeichnisse sollte in der Programmierung mittels entsprechender Klassen und Librarys stattfinden. Falls dies nicht möglich ist, kann man neben dem manuellen Parsen der Datei auch das Programm xdg-user-dir verwenden, hier übergibt man den Kurznamen des gewünschten Verzeichnisses, und bekommt den dazugehörigen Pfad zurück.

dg-user-dir TEMPLATES
/home/user/Dokumente/Vorlagen

Wenn man keinen Namen angibt, wird der Pfad des Home-Verzeichnisses zurückgegeben.

Siehe auch

Weblinks