typische Anwendungsfälle
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
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]:
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 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]:
# 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]:
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]:
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:
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]:
gcc --help
und
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:
LANG=C LC_ALL=C gcc --help
weitere Praxisbeispiele¶
Umgebungsvariablen anzeigen¶
Mit dem Kommando printenv
kann man den Wert einer Umgebungsvariablen ausgeben lassen [1]:
# 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 GUI man benutzt. Dieser Befehl erzählt in seiner Ausgabe, ob man X11 oder Wayland verwendet und auch welchen Desktop [1]:
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]:
1 2 3 4 5 6 7 8 9 10 | #!/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: 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]:
./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:
Die komplette Programmumgebung der aufrufenden Shell wird kopiert.
env
wird mit der kopierten Programmumgebung gestartet.env
schreibt seine Aufrufparameter in seine Programmumgebung.env
ersetzt sich selbst (perexec
) durch PROGRAMM. Damit läuftPROGRAMM
in der vonenv
konstruierten Programmumgebung.
Die Shell Bash hat diesen Mechanismus eingebaut. Auf der Kommandozeile einer Bash bzw. im Bash-Skript führt daher der 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:
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]:
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:
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:
LANG=C LC_ALL=C gcc --help
Die dauerhafte Umschaltung der Bediensprache bis zu Beendigung dieser Shell erfolgt, indem man kein PROGRAMM
angibt:
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
:
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