Zum Inhalt springen

XDG-Verzeichnisse: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
Zeile 64: Zeile 64:
export XDG_DATA_DIRS
export XDG_DATA_DIRS
}}
}}
Auch besteht die Möglichkeit, die Variablen durch PAM beim Anmelden laden zu lassen. Das folgende Beispiel entspricht im Ergebnis dem vorherigen Beispiel.
{{hc|1=/etc/security/pam_env.conf|2=
XDG_CACHE_HOME  DEFAULT0@{HOME}/.cache
XDG_CONFIG_HOME  DEFAULT=@{HOME}/.config
[weitere]
}}
Will man die Konfiguration der Variablen erzwingen, und bestehende Konfiguration bei der authentifizierung mittels PAM überschreiben, so kann man statt {{ic|1=DEFAULT=}} die Definition {{ic|1=OVERRIDE=}} verwenden.
Selbstverständlich kann man die Variablen auch useraccountbezogen definieren, zum Beispiel bei Verwendung der [[Bash]]durch simples Exportieren in der [[bashrc|.bashrc]].
{{hc|1=$HOME/.bashrc|2=
export XDG_CACHE_HOME="$HOME/.cache"
export XDG_CONFIG_HOME="$HOME/.config"
[weiter Konfiguration]
}}
Es ist dabei zu beachten, dass verscheidene [[:Kategori:Shell|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.


=== Auslesen ===
=== Auslesen ===

Version vom 21. März 2025, 10:52 Uhr

„XDG-Verzeichnisse“ wurde von Dirk (Diskussion) als in Bearbeitung markiert. Um Bearbeitungskonflikte zu vermeiden, kontaktiere Dirk (Diskussion) bitte, bevor du den Artikel bearbeitest.


Dieser Artikel oder Artikelabschnitt ist noch nicht vollständig!


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 Verwaltung der User Directorys das Programmpaket xdg-user-dirs installieren. Auf den meisten Systemen wird dies aber schon bereits durch Abhängigkeiten installiert worden sein.


Das Programm 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 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, sowie Umgebungsvariablen, um diese Pfade anzubieten und zu verwalten. Man sollte die entsprechenden Variablen im angegebenen Kontext setzen, und auf den „Ziel“-Pfad verweisen lassen.

Kontext Variable Ziel Verwendung
User XDG_CACHE_HOME $HOME/.cache Nicht-essentielle Cache-Dateien
User XDG_CONFIG_HOME $HOME/.config Konfigurationsdateien
User XDG_RUNTIME_DIR /run/user/$UID Nicht-essentielle Laufzeitdateien
User XDG_DATA_HOME $HOME/.local/share Architekturunabhängige Datendateien
User XDG_STATE_HOME $HOME/.local/state Persistente Zustandsdateien
System XDG_CONFIG_DIRS /etc/xdg Wie PATH, aber für Konfigurationsdateien
System XDG_DATA_DIRS /usr/local/share:/usr/share Wie PATH, aber für Datendateiverzeichnisse

Einige Programme ignorieren die Variablen und nutzen die angegebenen Ziel-Pfade direkt.

Setzen

Da die Base Directorys per Umgebungsvariablen dem system bekannt gegeben werden, kann man die Ddefinitionen wie alle anderen Variablen auch, entweder Userbezogen oder Systemweit in Entsprechende Konfigurationsdateien schreiben.

Eine Systemweite Konfiguration kann man zum Beispiel in /etc/profile.d/ 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

Auch besteht die Möglichkeit, die Variablen durch PAM beim Anmelden laden zu lassen. Das folgende Beispiel entspricht im Ergebnis dem vorherigen Beispiel.

/etc/security/pam_env.conf
XDG_CACHE_HOME   DEFAULT0@{HOME}/.cache
XDG_CONFIG_HOME  DEFAULT=@{HOME}/.config
[weitere]

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.

Selbstverständlich kann man die Variablen auch useraccountbezogen definieren, zum Beispiel bei Verwendung der Bashdurch 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 verscheidene 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.

Auslesen

Da die konfigurierten Base Directorys als Umgebungsvariablen im System vorliegen, kann man diese einfach 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 für den Fall dass die Variablen nicht gesetzt sind, den ind er 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 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 Videosclipsto 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.

Weblinks