[[Vorlage (Getestet general)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal verwenden] [:mit Root-Rechten arbeiten:] }}} [[Inhaltsverzeichnis()]] [[Bild(Wiki/Icons/terminal.png, 48, align=left)]] Eine [wikipedia:Umgebungsvariable:Umgebungs-Variable] (Environment-Variable) wird z.B. für Komfortfunktionen in der [:Shell:] verwendet, um Suchpfade zu Programmen oder eine zentrale [:Proxyserver:Proxy]-Konfiguration zu setzen. Environment-Variablen werden bei der [wikipedia:Prozess_(Informatik):Prozess]-Generierung "vererbt", d.h. Kindprozesse bekommen eine Kopie des Environments des Vaterprozesses und vererben diese auch wieder an ihre Kinder weiter. Mit dem Kommando `echo` kann man sich den Variableninhalt ausgeben lassen [1]: {{{#!vorlage Befehl echo $VARIABLE }}} {{{ Wert_der_Variable }}} Mit `printenv` kann man alle Variablen auf einmal anzeigen lassen. Für die aktuelle Shell definiert man eine Variable wie folgt: {{{#!vorlage Befehl VARIABLE=0815 }}} Das Kommando `export` sorgt dafür, dass die Variable nicht nur in der aktuellen Shell, sondern auch in den von der aktuellen Shell aus aufgerufenen Programmen zur Verfügung steht: {{{#!vorlage Befehl export VARIABLE }}} Man kann das alles auch in eine einzige Zeile packen: {{{#!vorlage Befehl export VARIABLE=0815 }}} Allgemein kann man sich die Programmumgebung als einen Satz von Schlüssel-Werte Paaren in der Form {{{NAME_DER_VARIABLE=Wert_der_Variable }}} vorstellen. Einige gängige, vordefinierte Umgebungsvariablen sind: * HOME zeigt, wo der Besitzer des Prozesses seine eigenen Daten speichert. * PATH gibt an, wo im Dateisystem ausführbare Programme gesucht werden sollen (→ [:Umgebungsvariable/typische_Anwendungsfälle/#PATH-erweitern:]). * PWD bezeichnet den Ort im Dateisystem, der zur Konstruktion eines absoluten Dateinamens dem relativen Dateinamen vorangestellt wird. * LANG gibt die Sprache an, in der das Programm mit dem Bediener kommunizieren soll (→ [:Umgebungsvariable/typische_Anwendungsfälle/#Locale:] ff). = Regeln für die Namensgebung = Legt man eigene Umgebungsvariablen an, sollte man folgenden Punkte berücksichtigen: * Für den Namensteil einer Umgebungsvariablen kann man nur druckbare, aber keine regions- oder sprachspezifischen Zeichen verwenden; als Sonderzeichen ist nur der Unterstrich zulässig. * Nach einer vorsichtigen Konvention verwendet man für den Namensteil einer Umgebungsvariablen nur die ASCII-Buchstaben A-Z und a-z, den Unterstrich „_“ und die Ziffern „0-9“. Umgebungsvariable auf Systemebene verwenden keine Kleinbuchstaben. Variablen dürfen nicht mit einer Ziffer beginnen. * Bei Benutzung einer Shell sind oft die Werte von Umgebungsvariable und gleichnamiger Shell-Variable abzugleichen. In diesen Fällen ist für `NAME_DER_VARIABLEN` die Syntax für Shell-Variablen zu beachten. Beispielsweise ist zwar „`NAME-DER-VARIABLEN`“ ein zulässiger Namensteil einer Umgebungsvariable, jedoch kein gültiger Bezeichner für eine Shell-Variable. „`NAME_DER_VARIABLEN`“ ist in beiden Welten gültig. * Für den Wertteil einer Umgebungsvariablen hat man grundsätzlich größere Freiheit. Jedoch kann man in der Praxis bei der Übertragung aus der Darstellung in einer Textdatei in den Programmspeicher kein Verfahren zur Umschreibung nicht druckbarer Zeichen voraussetzen. = Export von Variablen = Der Export einer Shell-Variablen bewirkt, dass diese Variable auch für zukünftige Kommandos bzw. aus der aktuellen Shell aufgerufenen Programmen zur Verfügung steht. Dies geschieht durch Eintrag der Shell-Variablen in die Programmumgebung, d.h. eine Umgebungsvariable wird angelegt. Die Markierung einer Variablen mit dem Export-Attribut hängt von der verwendeten Shell ab. [:Bash:] und [:Dash:] verstehen die POSIX-konforme Methode: {{{#!vorlage Befehl NAME_DER_VARIABLE=Wert-der-Variable ; export NAME_DER_VARIABLE # POSIX-konform export NAME_DER_VARIABLE=Wert-der-Variable # POSIX-konform }}} also auch die folgenden Methoden: {{{#!vorlage Befehl NAME_DER_VARIABLE=Wert-der-Variable ; declare -x NAME_DER_VARIABLE # Bash-Stil declare -x NAME_DER_VARIABLE=Wert-der-Variable # Bash-Stil NAME_DER_VARIABLE=Wert-der-Variable ; typeset -x NAME_DER_VARIABLE # Bash-Stil, jedoch veraltet typeset -x NAME_DER_VARIABLE=Wert-der-Variable # Bash-Stil, jedoch veraltet }}} = Dauerhafte Änderungen = Solche Variablen gelten nur für die aktuelle Sitzung. Variablen lassen sich jedoch auch dauerhaft definieren, indem man diese [:Umgebungsvariable/Dateien: in den Konfigurationsdateien einträgt]. = Umgebungsvariablen für laufenden Prozess ändern und abfragen = Jeder Prozess kann seine Umgebungsvariable (auch) aus der Datei '''/proc/self/environ''' lesen. Das kann man sich bspw. so anzeigen lassen: {{{#!vorlage Befehl cat /proc/self/environ | tr '\0' '\n' }}} Jedes Programm kann den Wertteil seiner eigenen Umgebungsvariablen verändern, sowie auch in der eigenen Programmumgebung Umgebungsvariablen löschen und neue anlegen, jedoch bieten nicht alle Programme auch dem Bediener Zugang zu diesen Funktionalitäten. Der direkte Zugriff auf auf die Umgebungsvariable anderer Programme ist nicht möglich; jedoch lassen sich diese dennoch teilweise ausspionieren: Unter '''/proc//environ''' liegen nämlich Kopien der Programmumgebungen, so wie sie zum Start des jeweiligen Prozesses ausgesehen haben. Der Befehl {{{#!vorlage Befehl sudo cat /proc/1/environ | tr '\0' '\n' }}} zeigt beispielsweise die Programmumgebung des Init-Prozesses [2]. Bei der Prozessgenerierung bestimmt das den Start veranlassende Programm (parent) die Programmumgebung des von ihm gestarteten Programms (child). In der Regel vererbt der Mutterprozess seine Programmumgebung mit geringen oder ohne Änderungen an den Tochterprozess, jedoch ist dies nicht verpflichtend. = Links = * [:Umgebungsvariable/Dateien:] – Dateien, in denen man eigene Umgebungsvariablen hinterlegen kann * [:Umgebungsvariable/typische_Anwendungsfälle:] # tag: System, Übersicht, Shell, Programmierung