ubuntuusers.de

ℹ️ Hinweis: durch Arbeiten am DNS und weiteren System kann es in den heutigen Abendstunden zu Beeinträchtigungen bei ubuntuusers.de kommen.

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

  • 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:

  1. Die komplette Programmumgebung der aufrufenden Shell wird kopiert.

  2. env wird mit der kopierten Programmumgebung gestartet.

  3. env schreibt seine Aufrufparameter in seine Programmumgebung.

  4. 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

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 

Diese Revision wurde am 14. Februar 2020 12:29 von linux_joy erstellt.