typische Anwendungsfälle
typische Anwendungsfälle¶
PATH=/usr/local/progdir:$PATH
Beide Befehl wirken allerdings nur temporär. Um PATH
dauerhaft und systemweit zu erweitern, muss die Datei /etc/environment editiert werden. Entsprechend muss benutzerspezifisch die Datei ~/.profile bearbeitet werden.
Proxy definieren¶
Erfolgt die Verbindung mit dem Internet über einen Proxyserver, so lässt sich dies in folgender Weise einstellen:
export http_proxy=http://mein.proxy.firma
oder mit Portangabe
export http_proxy=http://mein.proxy.firma:3128
Analog funktioniert das auch mit ftp_proxy
für FTP.
Proxy definieren¶
Erfolgt die Verbindung mit dem Internet über einen Proxyserver, so lässt sich dies in folgender Weise einstellen:
# 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 UV kennt und auswertet!
PATH erweitern¶
Die UV PATH
gibt die Verzeichnisse an, die bei einem Programmaufruf nach dem entsprechenden Programm durchsucht werden; dabei werden die einzelnen Verzeichnisse voneinander durch Doppelpunkt getrennt. Soll z.B. /usr/local/progdir zusätzlich in den Suchpfad aufgenommen werden, lässt sich dies in einer Shell durch einen der folgenden Befehle bewerkstelligen:
PATH=$PATH:/usr/local/progdir # neues Verzeichnis zuletzt durchsuchen PATH="/usr/local/progdir:$PATH" # neues Verzeichnis zuerst durchsuchen
Die Anführungszeichen sind nur dann erforderlich, wenn Verzeichnisnamen Leerzeichen enthalten.
Damit wird zunächst die existierende Shell-Variable PATH
modifiziert. Für eine Übertragung einer Shell-Variablen in die Programmumgebung erwartet man noch das export
-Kommando; dieses ist bei der Bash sowie der Dash hier jedoch nicht erforderlich, weil diese Shells im Environment bereits existierende UV mit gleichnamigen Variablen automatisch abgleicht. Andererseits schadet ein überflüssiges export
auch nicht.
export PATH # Befehl zulässig, aber bei existierender UV nicht erforderlich
Diese Änderung wirkt nur lokal in der laufenden Instanz der Shell sowie für alle von dieser Instanz gestarteten Programme und auch nur temporär bis zur Beendigung dieser Shell.
Wenn man in jeder zukünftig von diesem Benutzer gestarteten Shell die neue Einstellung gelten soll, muss man den Befehl in eine Initialisierungsdatei schreiben:
Um
PATH
dauerhaft für einen bestimmten Benutzer zu erweitern, setzt man einen entsprechenden Befehl in die Datei ~/.profile im HOME-Verzeichnis dieses Benutzers.Um
PATH
dauerhaft für alle Benutzer bei der Anmeldung zu setzen, kann man die Datei /etc/environment verwenden oder man kann eine Datei im Verzeichnis /etc/profile.d/ anlegen.
PATH erweitern¶
In der Variable PATH
sind die Verzeichnisse hinterlegt, die bei einem Programmaufruf nach dem entsprechenden Programm durchsucht werden. Soll z.B. /usr/local/progdir zusätzlich in den Suchpfad aufgenommen werden, lässt sich dies folgendermaßen bewerkstelligen:
PATH=$PATH:/usr/local/progdir
Damit wird der existierenden Variable PATH
am Schluss ein weiterer Suchpfad /usr/local/progdir
(durch einen Doppelpunkt getrennt) angehängt. Ein export
-Kommando ist hier nicht erforderlich, weil die Shell im Environment existierende Werte automatisch aktualisiert. Da die Reihenfolge innerhalb der Variablen berücksichtigt wird (die Auswertung erfolgt von links nach rechts), kann man bei Bedarf den neuen Suchpfad auch voranstellen:
human-readable BLOCK_SIZE¶
Viele GNU-Programme (df, du, ls usw.) zeigen Größen in "blocks" an. Diese Anzeige, der block-Größe, kann man so abändern, das sie leichter zu lesen ist.
BLOCK_SIZE=human-readable
Das Vererben (export) dieser Variable ist jedoch nicht ratsam, damit die Ausgabe in Shell-Skripten etc. weiterhin stimmt.
Locale¶
Über die Locale-Umgebungsvariablen lassen sich Meldungen in Landessprache (Ausgabe und Fehlermeldungen) von Programmen einstellen.
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):
LANG=en_US.UTF-8 PROGRAMM
Ab Ubuntu 14.04:
LANGUAGE=de PROGRAMM
Für deutsche Schrift innerhalb eines Programmes.
Programmkontext manipulieren¶
Einem Programm können beim Aufruf einmalig veränderte oder neue Umgebungsvariablen mitgegeben werden. Diese haben Vorrang gegenüber vererbten Werten. Vergleiche:
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
Links¶
Shell Übersichtsartikel
Praxisbeispiele¶
UV anzeigen¶
Mit dem Kommando printenv
kann man zu einem UV-Namen deren Wert 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 UV-Namens zeigt printenv
alle UV.
GUI identifizieren¶
Gelegentlich muss man abfragen, welche GUI man benutzt. Dieser Befehl erzählt, ob man X11 oder Wayland verwendet und auch welchen Desktop:
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:
#!/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.
UV im Skript verwenden¶
Das Skript env-chain aus dem vorausgehenden Abschnitt ist auch ein Beispiel für die Verwendung von UV in Programmen: Wenn die UV 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:
./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 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_UV= printenv env -i neue_UV= printenv
Programmausgabe steuern¶
Viele GNU-Programme (df, du, ls usw.) zeigen Größen in "blocks" an. Diese Anzeige, der block-Größe, kann man so abändern, das sie leichter zu lesen ist.
export BLOCK_SIZE=human-readable
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:
localectl list-locales
Normalerweise erfolgen Programmausgaben in der durch die UV 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