Umgebungsvariablen und mehr

Ein paar wichtige Informationen bekommt jeder genetisch mitvererbt, wenn er das Licht der Welt erblickt.
Das ist bei Prozessen ganz ähnlich wie bei Menschen.

Die “Umgebung” (“Environment”) beinhaltet einige Datenwerte, die der Elternprozess seinen Kindern “aufdrücken” kann, und wenn er sich nicht weiter darum kümmert bekommen die Kinder das gleiche, was er selbst auf den Weg mitbekommen hat … die Umgebung wird also vererbt.

Es wäre schön, wenn es einen ausgeprägten Standard gäbe, was in “der Umgebung” alles gespeichert ist, doch bis auf wenige Details haben unterschiedliche Anwendungsgruppen auch unterschiedliche Umgebungsvariablen ausgeprägt.

Jedenfalls gibt es APIs um auf die eigene Umgebung zuzugreifen, und Windows vertraut dabei auf GetEnvironmentVariable(), während Unices mit getenv() arbeiten.

Während Unix Systeme auf diese Umgebung “vertrauen”, stellt Windows für einige Felder eigene APIs bereit:

  1. Das “temporäre” Verzeichnis
    Hier dürfen Programme Dateien ablegen, die nur kurzzeitig zur Datenauslagernung genutzt und dann gelöscht werden.
    • Unter Windows zeigt die Umgebungsvariable TEMP auf diese Verzeichnis. Doch zusätzlich gibt die API GetTempPath() ebenso dieses zurück.
    • Linux benennt diese Variable TMPDIR und die API tempnam() kann benutzt werden um darin gleich eine neue Datei anzulegen.
  2. Das Benutzer-Verzeichnis, auch HOME Directory genannt Viele Daten des Benutzers und der von ihm gestarteten Programme liegen hier.
    • Unter Windows heißt die Variable USERPROFILE, doch der Wert kann auch von der Shell-API SHGetSpecialFolderPath() mit dem Wert CSIDL_PROFILE ermittelt werden.
    • Linux bezeichnet sie einfach als HOME, zusätzlich können Dateien darin einfach adressiert werden, wenn der Pfad mit ~/ beginnt.
  3. Suchorte für nicht-absolute Pfade, auch als PATH bekannt Der PATH beinhaltet eine Liste von Verzeichnissen, in denen Dateien gesucht werden, wenn man sie nicht absolut adressiert und sie nicht im aktuellen Arbeitsverzeichnis liegen. Windows und Linux nutzen hier ausnahmsweise mal den gleichen Bezeichner PATH, doch während die einzelnen Pfade unter Windows durch Strichpunkte ; getrennt sind, nutzt Linux Doppelpunkte :.

Alle anderen mir bekannten Umgebungseinstellungen sind recht spezifisch an das jeweilige OS bzw. dessen Programme angepasst, von daher macht es wenig Sinn noch mehrere zu nennen.

Ein für meine Anwendungszwecke wichtiger Teil, fehlt allerdings:

In welches Verzeichnis, darf mein Programm Einstellung permanent ablegen?

Windows kennt hier den Standard, dass im USERPROFILE einige Unterverzeichnisse existieren, in welchen Programme wiederum ihre eigenen Unterverzeichnisse anlegen dürfen um dort Daten abzulegen.

Damit ist vor allem das \AppData\Local Verzeichnis gemeint, welches permanent SHGetSpecialFolderPath() mit CSIDL_LOCAL_APPDATA zurückgeliefert wird.

Unter Linux kenne ich keine formale API, doch dafür den de-facto Standard alles im HOME-Unterverzeichnis ~/.config abzulegen. Programme erstellen dort eindeutige Dateien oder Unterverzeichnisse für den Eigenbedarf.

X11 bzw. freedesktop.org erweitert dieses Konzept um weitere “sichtbare” Verzeichnisse für Dokumente, Musik, Videos und die Desktopablage, so wie wir es von SHGetSpecialFolderPath() unter Windows bereits kennen.
Über die Konfigurationsdatei ~/.config/user-dirs.dirs kann man diese Standardwerte abändern.
Und am Ende landen die Verzeichnisse als Variablen im Environment.


Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!