[[Vorlage (Getestet general)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal verwenden] [:Editor: Einen Editor verwenden] [:mit Root-Rechten arbeiten:] }}} [[Inhaltsverzeichnis(6)]] Dieser Artikel beschreibt typische Anwendungsfälle, bei denen [:Umgebungsvariablen:] gesetzt werden können. Mit der Definition von Umgebungsvariablen über Konfigurationsdateien beschäftigt sich der Unterartikel [:Umgebungsvariable/Dateien:]. = PATH erweitern = Die Umgebungsvariable `PATH` beinhaltet alle Verzeichnisse (getrennt durch ':'), in denen ein ausführbarer Befehl bzw. Programm gesucht wird, so dass es nur mit dem Befehl ohne vollständigen Pfad aufgerufen werden kann. Diese Variable kann wie folgt an die eigenen Anforderungen angepasst werden: * Nur für die aktuelle Sitzung und auch nur in der aktuellen Shell [1]:{{{#!vorlage Befehl PATH=$PATH:/usr/local/progdir # neues Verzeichnis zuletzt durchsuchen PATH="/usr/local/progdir:$PATH" # neues Verzeichnis zuerst durchsuchen }}} * Um `PATH` dauerhaft zu erweitern, müssen – je nachdem, für wieviele Benutzer diese Änderung gelten soll – verschiedene [:Umgebungsvariable/Dateien: Konfigurationsdateien] editiert werden: * systemweit (für alle Benutzer) ist es die Datei '''/etc/environment'''. Seit Ubuntu [:17.10:] geht das auch über '''/etc/environment.d/*.conf''', was den Vorteil hat, dass die Originaleinstellung erhalten bleibt, und die individuelle Erweiterung schnell (auch temporär) deaktiviert werden kann. * nur für den aktuellen Benutzer ist es die (versteckte) Datei '''~/.profile''' im [:Homeverzeichnis:]. = Proxy definieren = Erfolgt die Verbindung mit dem Internet über einen [:Proxyserver:], so lässt sich dies in folgender Weise einstellen [1]: {{{#!vorlage Befehl # export proxy=URL export ftp_proxy=http://ftp.example.com # Beispiel, Name und Wert sind anzupassen! export http_proxy=http://www.example.com:3128 # Beispiel, Name und Wert sind anzupassen! }}} Natürlich funktioniert das nur, wenn das verwendete Programm auch diese Umgebungsvariable kennt und auswertet. = human-readable BLOCK_SIZE = Viele GNU-Programme ([:df:], [:du:], [:ls:] usw.) zeigen Größen in `blocks` an. Diese Anzeige der Blockgröße kann man so abändern, das sie leichter zu lesen ist [1]: {{{#!vorlage Befehl BLOCK_SIZE=human-readable }}} Das Vererben (export) dieser Variable ist jedoch nicht ratsam, damit die Ausgabe in Shellskripten etc. weiterhin stimmt. = Locale = Über die Locale-Umgebungsvariablen lassen sich Meldungen in Landessprache (Ausgabe und Fehlermeldungen) von Programmen einstellen [1]: {{{#!vorlage Befehl LANG=de_DE.UTF-8 export LANG }}} Im folgenden Beispiel wird ein einzelnes Programm explizit mit einer anderen als der Systemsprache gestartet (hier in Englisch), gilt seit Ubuntu [:14.04:]: {{{#!vorlage Befehl LANGUAGE=de PROGRAMM }}} Für deutsche Sprache innerhalb eines Programms. = Programmkontext manipulieren = Einem Programm können beim Aufruf einmalig veränderte oder neue Umgebungsvariablen mitgegeben werden. Diese haben Vorrang gegenüber vererbten Werten. Vergleiche [1]: {{{#!vorlage Befehl gcc --help }}} und {{{#!vorlage Befehl LANG="en_GB.UTF-8" gcc --help }}} Auf diese Weise ist es möglich, für einen spezifischen Aufruf einem Programm englischsprachige Ausgaben zu entlocken, die man z.B. in internationalen Hilfeforen verwenden kann. Die Standardlokalisierung kann mit "`C`" angesprochen werden: {{{#!vorlage Befehl LANG=C LC_ALL=C gcc --help }}} = weitere Praxisbeispiele = == Umgebungsvariablen anzeigen == Mit dem Kommando `printenv` kann man den Wert einer Umgebungsvariablen ausgeben lassen [1]: {{{#!vorlage Befehl # printenv NAME_DER_VARIABLE ... printenv PATH LANG USER }}} Ausgabe: {{{ /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin de_DE.UTF-8 klaus }}} Ohne Angabe eines Parameters zeigt `printenv` alle Umgebungsvariablen. == GUI identifizieren == Gelegentlich muss man abfragen, welche [wikipedia:GUI:] man benutzt. Dieser Befehl erzählt in seiner Ausgabe, ob man [:XServer:X11] oder [wikipedia:Wayland_(Display-Server-Protokoll):Wayland] verwendet und auch welchen [:Desktop:] [1]: {{{#!vorlage Befehl printenv | grep XDG_SESSION }}} == Aufruf-Hierarchie anzeigen == Mit Hilfe des Skripts '''env-chain''' kann man sich die Eltern eines Prozesses inkl. ihrer Programmumgebung anzeigen lassen [2][3]: {{{#!code bash #!/bin/bash -e # env-chain – Zeige Eltern eines Prozesses mit Programmumgebung # (C) 2018 Klaus Bielke kb @ ubuntuusers.de for (( pid = ${1:-$PPID} ; 0 < pid ; pid=$( ps -o ppid= $pid | tr -d ' ' ) )) { ps -o ppid,pid,user,euser,command $pid sudo cat /proc/$pid/environ | tr '\0' '\n' test -v ENV_CHAIN_WAIT && read -s -n1 || true echo } }}} Das Skript erwartet die Prozess-Identifikation (Abk: [wikipedia:Process_identifier:PID]) des zu untersuchenden Prozesses als Argument; bei fehlender Angabe wird die PID des dieses Skript aufrufenden Prozesses verwendet. Siehe auch Bedienhinweise im folgenden Abschnitt. == Umgebungsvariablen im Skript verwenden == Das Skript '''env-chain''' aus dem vorausgehenden Abschnitt ist auch ein Beispiel für die Verwendung von Umgebungsvariablen in Programmen: Wenn die Umgebungsvariable `ENV_CHAIN_WAIT` existiert, pausiert das Skript nach jeder Ausgabe einer Programmumgebung bis es nach Tastendruck zum Mutterprozess wechselt. Dabei muss `ENV_CHAIN_WAIT` definiert sein, aber nicht notwendigerweise einen Wert haben. Man vergleiche die Ausgaben dieser beiden Befehle [1]: {{{#!vorlage Befehl ./env-chain ENV_CHAIN_WAIT= ./env-chain }}} == Programmumgebung konstruieren == Das Programm `env` konstruiert für einen Programmaufruf eine Programmumgebung aus seinen Aufrufparametern und startet ein Programm in der neuen Umgebung. Beispielsweise bewirkt der Aufruf von {{{env cmd=create DieAntwort=42 PATH=/usr/local/bin PROGRAMM }}} aus einer Shell [1] folgendes: 1. Die komplette Programmumgebung der aufrufenden Shell wird kopiert. 1. `env` wird mit der kopierten Programmumgebung gestartet. 1. `env` schreibt seine Aufrufparameter in seine Programmumgebung. 1. `env` ersetzt sich selbst (per `exec`) durch '''PROGRAMM'''. Damit läuft `PROGRAMM` in der von `env` konstruierten Programmumgebung. Die [:Shell:] Bash hat diesen Mechanismus eingebaut. Auf der Kommandozeile einer Bash bzw. im Bash-Skript führt daher der Befehl {{{#!vorlage Befehl cmd=create DieAntwort=42 PATH=/usr/local/bin PROGRAMM }}} zum gleichen Ergebnis (hier allerdings per `fork` statt `exec`). Mit der Option `-i` kann man das Programm `env` anweisen, die Programmumgebung des aufrufenden Programms zu ignorieren. Man vergleiche die Ausgaben dieser beiden Befehle: {{{#!vorlage Befehl env neue_Umgebungsvariable= printenv env -i neue_Umgebungsvariable= printenv }}} == Bediensprache ändern == Über die Locale-Umgebungsvariablen lässt sich die Landessprache der Meldungen (Ausgabe und Fehlermeldungen) von Programmen einstellen. Man kann natürlich nur auf die im System bereitstehenden Locale umschalten [1]: {{{#!vorlage Befehl localectl list-locales }}} Normalerweise erfolgen Programmausgaben in der durch die Umgebungsvariable `LANG` benutzerspezifisch angegebenen Standardsprache. Im folgenden Beispiel wird ein einzelnes Programm `PROGRAMM` einmalig explizit in einer anderen (hier Englisch) als der Standardsprache gestartet: {{{#!vorlage Befehl LANG=en_US.UTF-8 PROGRAMM }}} Auf diese Weise ist es möglich, für einen spezifischen Aufruf einem Programm englischsprachige Ausgaben zu entlocken, die man z.B. in internationalen Hilfeforen verwenden kann. Die Standardlokalisierung eines Programms (meist Englisch) kann mit „`C`“ angesprochen werden: {{{#!vorlage Befehl LANG=C LC_ALL=C gcc --help }}} Die dauerhafte Umschaltung der Bediensprache bis zu Beendigung dieser Shell erfolgt, indem man __kein__ `PROGRAMM` angibt: {{{#!vorlage Befehl LANG=en_US.UTF-8 }}} Auch hier ist in der Regel wie bei `PATH` kein `export` erforderlich. Falls man irgendwann wieder auf die normale Sprache zurück schalten möchte, merkt man sich vorher die bisher benutzte Spracheinstellung in einer Shell-Variable, z.B. `old_LANG`: {{{#!vorlage Befehl old_LANG=$LANG LANG=en_US.UTF-8 }}} = Links = * [:Umgebungsvariablen:] – Start- / Hauptseite zu diesem Thema im WIki * [:Umgebungsvariable/Dateien:] – Dateien, in denen man eigene Umgebungsvariablen hinterlegen kann ##tag: System, Shell