XDG-Verzeichnisse
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.
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

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
- Liste mit Programmen die die Spezifikation unterstützen im englischen Wiki