Umgebungsvariable

Als Umgebungsvariable bezeichnet man konfigurierbare Variablen in Betriebssystemen, die oft Pfade zu bestimmten Programmen oder Daten enthalten, sowie bestimmte Daten und Einstellungen, die von mehreren Programmen verwendet werden können. In der Regel handelt es sich um Zeichenketten.

Eine andere Bezeichnung ist auch globale Variable; allerdings ist das eher unüblich, da dies in vielen Programmiersprachen in einer anderen Bedeutung verwendet wird.

Benutzer oder Anwendungen können Werte dieser Variablen lesen und/oder verändern.

Unix und Unix-ähnliche Betriebssysteme

Kommandozeile 
In vielen auf UNIX basierenden Betriebssystemen, etwa macOS, Linux oder BSD, werden Umgebungsvariablen beim Start eines Kommandozeileninterpreters (Shell) gesetzt. Vordefinierte Umgebungsvariablen werden in der Regel beim Start einer Shell gemäß den Einträgen in einer oder auch mehreren Konfigurationsdateien automatisch gesetzt. In der Bourne-Shell ist dies beispielsweise die Datei /etc/profile. Zusätzlich benutzt die Shell eine im Heimatverzeichnis des Benutzers vorhandene Datei (z. B. .profile oder .cshrc), die benutzerspezifische Umgebungsvariablen enthält und vom Benutzer selbst angepasst werden kann. Diese vordefinierten Umgebungsvariablen kann man sich durch die Eingabe von printenv in der Shell auch ausgeben lassen. Das Programm env zeigt alle Umgebungsvariablen an oder lässt ein Programm in einer veränderten Umgebung laufen. Beide Befehle sind Bestandteil der coreutils.

Vordefinierte Umgebungsvariablen 
Einige Umgebungsvariablen finden sich auf fast allen Unix-Systemen wieder. Beispiele hierfür sind:

Änderung der Umgebungsvariablen 
Umgebungsvariablen können folgendermaßen gesetzt und den anderen Prozessen innerhalb des Betriebssystems bekannt gemacht werden:

Bei Bourne, bash und darauf aufbauenden Shells:

Bei csh, tcsh und darauf aufbauenden Shells:

Anzeigen von Umgebungsvariablen

Anzeigen aller Umgebungsvariablen

Anzeigen einer bestimmten Umgebungsvariablen 
Bei allen Shells:

Prozessabhängigkeit 
Es ist üblich, dass die Umgebungsvariablen pro System-Prozess gespeichert werden. Änderungen, die ein Prozess an den Variablen vornimmt, sind nur für ihn selbst gültig und für Prozesse, die von ihm nach der Änderung gestartet werden (Child-Prozesse).

DOS und Windows 
Die Funktionalität unter MS-DOS (und kompatiblen DOS) und Windows ist gleich. Der Umfang an Funktionen und Standardvariablen ist bei Windows allerdings größer. Auch können Variablen unter Windows nicht nur system- bzw. umgebungsweit gesetzt werden (z. B. per Systemsteuerung), welche von sämtlichen Sub-Prozessen genutzt werden können, sondern auch auf eine einzelne Sitzung eines gestarteten Sub-Prozesses beschränkt sein. Ein Sub-Prozess übernimmt zunächst alle Variablen der übergeordneten Umgebung () bzw. des aufrufenden übergeordneten Prozesses (z. B. COMMAND.COM, CMD.COM, Explorer.exe oder andere) in sein Umgebungssegment (worauf ein Zeiger im PSP an Adresse 2Ch verweist), welches darauf folgend um weitere Variablen erweitert werden kann. Das Umgebungssegment eines (Sub-)Prozesses besteht ausschließlich während dessen Laufzeit und verfällt bei seiner Beendigung.

Setzen 
Umgebungsvariablen können von der Befehlszeile aus oder aus Stapelverarbeitungsdateien (.cmd, .BAT) mit dem SET-Befehl gesetzt werden (z. B. SET PROMPT=$P$G). Wird der SET-Befehl alleine angegeben, werden alle Umgebungsvariablen angezeigt, und wird nur der Name einer Variablen angegeben so wird deren Wert angezeigt. Löschen kann man sie, indem der Variablenname gefolgt von = angegeben wird (z. B. SET PROMPT=).

Abfrage 
In Stapelverarbeitungsdateien (.BAT) können Umgebungsvariablen eingesetzt werden, indem sie in Prozentzeichen eingeklammert werden (z. B. CD %VARIABLE%). Das aufgerufene Programm erhält dann die Befehlszeile mit substituierter Variable.

Setzen aus Programmen heraus 
Der Mechanismus der Umgebungsvariablen sieht nicht vor, dass aus einem Programm oder einer geschachtelt aufgerufenen Shell- (Cmd-) Umgebung heraus die Umgebungsvariablen der übergeordneten Shell geändert werden können. Aufgrund der Vererbung von Variablen wirken sich Veränderungen an der eigenen Umgebung nicht auf die Umgebung der COMMAND.COM (Master Environment) aus. Auch ein Aufruf des Befehlszeilenbefehls SET aus einem Programm heraus hat keine Wirkung, da dies eine neue Instanz der COMMAND.COM startet.

Folgender Trick war unter DOS und älteren Windows-Versionen möglich: Die Umgebung der COMMAND.COM konnte verändert werden, indem man über den ersten Speichersteuerblock über INT 21 AH=52h an Adresse [BX-2h] findet, und dann Speichersteuerblock für Speichersteuerblock durchsucht, bis man die Umgebung der COMMAND.COM findet und diese verändert. Das funktioniert allerdings nicht mehr ab Windows NT, da dort die Umgebung der COMMAND.COM regelmäßig vom NT-Kernel neu geladen wird.

Die Festlegung einer Umgebungsvariable in einem Programm und folgende Verwendung in einem Shell- oder Batch-Script ist  möglich, indem in dem Programm nach Ändern der eigenen Umgebung das Shell oder Batch-Script aus diesem Programm heraus gestartet wird. Ein solcher Aufruf wird in der Regel in Programmiersprachen mittels Aufruf der jeweiligen Betriebssystem-Funktion unterstützt, in Java beispielsweise mit der Klasse java.lang.ProcessBuilder. Die geänderte Umgebung des Programmes wirkt dann als parent für diesen Aufruf.

In Windows-Batch-Programmen und unter PC-kompatiblem DOS wirkt die Änderung der Umgebung einer gerufenen Batch (call-Befehl) auf die rufende Ebene, weil die COMMAND-Umgebung damit nicht verlassen wird. Das gilt nicht für den Aufruf eines Unix-Shell-Scripts aus einem Script. Das aufgerufene Script wird in eine neue (child-)Umgebung eingebettet, die also nicht für die rufende Ebene gilt.

In Windows ist es nun möglich, aus einem Programm heraus die Umgebung dennoch zu beeinflussen:
Das Programm muss eine kleine Batch-Datei in einem Temp-Verzeichnis oder dem aktuellen Verzeichnis mit folgendem Inhalt erzeugen:

 set VARIABLE=WERT

Dieses temporäre Batchfile wird dann im Gesamtbatch nachfolgend aufgerufen:

 mysetenv.exe someparameters >setenv.bat
 call setenv.bat
 folgende batch-befehle

Windows-Kommandozeile 
Um sich in der Kommandozeile den Wert einer Umgebungsvariable anzeigen zu lassen, verwendet man echo %NAME% oder set NAME, wobei für NAME der Variablenname eingesetzt wird.
Der set-Befehl steht ferner als Kommandozeilen-Editor zur Verfügung. Er lässt sich auch sehr gut innerhalb von Batch-Dateien verwenden. Der Befehl set als solcher listet alle gesetzten und somit verfügbaren Umgebungsvariablen auf. Möchte man eine Umgebungsvariable erstellen oder einer bestehenden einen neuen Wert zuweisen, nutzt man set NAME=WERT, wobei statt NAME der Name und statt WERT der künftige Wert der Variablen eingesetzt wird. set /? gibt ausführliche Informationen zu den Funktionalitäten des Befehls.

Grafische Oberfläche 
Einen grafischen Editor zum direkten Bearbeiten der Umgebungsvariablen bietet der Befehl rundll32 sysdm.cpl,EditEnvironmentVariables oder der Menüpunkt „Systemsteuerung – System“ oder die Tastenkombination +. Der Editor ist unter dem Register „Erweitert“ und dort unter „Umgebungsvariablen“ zu finden.

Benutzervariablen und Systemvariablen 
Neuere Windowsversionen (beispielsweise Windows XP oder Windows 7) unterscheiden zwischen „Benutzervariablen“, die sich nur auf den momentan eingeloggten Benutzer beziehen, und „Systemvariablen“, die für das gesamte System (also auch alle übrigen Benutzerkonten) gültig sind.

Dynamische Umgebungsvariablen 
Einige DOS- und Windows-Programme stellen von sich aus dynamisch generierte Umgebungsvariablen zur Verfügung. Diese werden nicht fest gespeichert, und der Wert wird kurz vor der Ausgabe ermittelt. Beispiele solcher dynamischer Umgebungsvariablen sind:

Vordefinierte Umgebungsvariablen 
Abhängig von der verwendeten Windows-Version stehen weitere, beim Systemstart oder beim Einloggen definierte Umgebungsvariablen bereit. Die Werte können von der Landessprache und von dem Laufwerksbuchstaben des Betriebssystemlaufwerkes abhängen. Zum Beispiel:

Registrierung 
Unter den neueren auf NT basierenden Versionen von Windows (Windows NT/2000/XP/2003/Vista) werden Umgebungsvariablen in der Registrierung gespeichert. Der Registrierungspfad
 HKEY_CURRENT_USER\Environment
bzw. bei Windows XP (für z. B. HOMEDRIVE) und Windows Vista
 HKEY_CURRENT_USER\Volatile Environment
wird für Umgebungsvariablen verwendet, welche nur den aktuellen Benutzer betreffen. Der Pfad
 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
hingegen dient zur Speicherung von Umgebungsvariablen, die im Gesamtsystem gültig sind.
Mit der Suchfunktion des Registrierungseditors lassen sich die Pfade bzw. Schlüssel nach den gewünschten Einträgen durchsuchen.

Mit dem Befehl regedit im Ausführen-Dialog (+) kann der Editor gestartet werden.

Achtung:
Unsachgemäße Veränderungen in der Registrierung können schwerwiegende Folgen haben. Änderungen sollten nur vorgenommen werden, wenn man weiß was man tut.
Es sollte vor jeder Änderung unbedingt eine Sicherung der betreffenden Registrierungsdaten vorgenommen werden!

Verzögerung bei der Anwendung geänderter Variablen 
Beim Start eines Prozesses (EXE-Datei) werden die aktuellen Umgebungsvariablen aus der Registry gelesen und dann „eingefroren“, der Prozess erhält also zu seiner Entstehung eine Kopie oder einen „Snapshot“ der aktuellen Variablen. Später geänderte Umgebungsvariablen wirken sich daher nicht auf die laufenden Prozesse aus (solange das Programm die entsprechende Windows-Botschaft nicht beachtet), sodass Prozesse wie eine laufende Shell („Eingabeaufforderung“) nichts davon mitbekommen. Sollen die Umgebungsvariablen in einer Shell verwendet werden, muss eine neue Instanz der Shell geladen werden. Es spielt dabei keine Rolle, ob eine bereits geöffnete Shell mit den alten Umgebungsvariablen vorher geschlossen wurde oder nicht. Es können dadurch zwei Shells mit unterschiedlichen Umgebungsvariablen ausgeführt werden.

Wird die Shell aus einem Windows-Explorer heraus gestartet (z. B. mittels „Open Command Window here“), und ist die Option „Ordnerfenster in einem eigenen Prozess starten“ in der Einstellung des Windows-Explorers aktiviert, so muss auch der Windows-Explorer neu gestartet werden, damit die geänderten Einstellungen sichtbar werden.

Siehe auch 
 Sonderverzeichnis, thematisch verwandt zu den Umgebungsvariablen in Windows

Einzelnachweise 

Programmierung
Betriebssystemtheorie