Umgebungsvariablen

Umgebungsvariablen enthalten wichtige Informationen über den Zustand des Systems. Einige Variablen werden von der verwendeten Shell vorgegeben bzw. werden beim Einloggen in das System automatisch gesetzt. Einige können hingegen lediglich gelesen werden, die meisten sind jedoch veränderbar durch den Benutzer.

Umgebungsvariablen gab es schon bei MS-DOS, allerdings in einem sehr eineschränkten Maße. Zudem durften alle Variablen zusammen nicht länger als 255 Bytes sein, dieses Limit existiert bei Unix natürlich nicht. Hier werden eine Vielzahl unterschiedlicher Variablen verwendet.

Wie unter Unix üblich wird auch hier zwischen Groß- und Kleinschreibung unterschieden. In einer Bourne Shell werden allgemeine Variablen normalerweise groß geschrieben, in einer C-Shell hingegen klein.

Die Liste der gesetzten Variablen kann man sich bei beiden mit dem Befehl "set" anzeigen lassen.

Abbildung 1: Zuordnung von Variablen in der Bourne Shell

Wozu werden sie verwendet?

Mit Hilfe von Umgebungsvariablen können bestimmte Zustände des Systems, wie z.B. Usernamen, Rechnerarchitekturen, Prozeßnummern, Dateinamen etc., gespeichert und später bearbeitet oder abgefragt werden.

In Skripten werden auf diese Weise Informationen zwischen einzelnen Modulen ausgetauscht. In einer Netzwerkumgebung mit unterschiedlichen Architekturen (i386, sparc, alpha etc.) kann über eine deartige Variable das jeweils passende Binärprogramm gefunden werden, z.B. über "~/bin/$HOSTTYPE/mein.programm".

Je nach Shell werden sie unterschiedlich gesetzt. In einer C-Shell ist dazu der interne Befehl "setenv" vorgesehen. (z.B. "setenv LINES 44") In einer Bourne Shell hingegen geschieht die Zuweisung einfach mit "COLUMNS=132".

Unveränderliche Variablen

In einem Unix-System gibt es normalerweise eine Reihe von vorgegebenen Variablen. Teilweise werden sie von der verwendeten Shell vorgegeben, teilweise werden Sie in einem der Boot- oder Einlog-Skripten gesetzt.

Wenn diese Variablen vom User verändert werden, kann es zu seltsamen Auswirkungen kommen. Sie sollten daher nur von erfahrenen Benutzern manipuliert werden.

HOME Enthält den Pfad zum Heimatverzeichnis des Users.
HOSTNAME Der aktuelle Rechnername.
HOSTTYPE Die verwendete Rechnerarchitektur, meist i386, bei anderen Architekturen wie z.B. beim Amiga enthält sie die Zeichenkette m68k.
IFS Das intern verwendete Zeichen, um Felder von einander zu trennen, z.B. bei Argumenten an ein Programm oder bei der Weiterverarbeitung in einer Shell-Funktion. Der Wert kann geändert werden, um Shellskripte flexibel zu gestalten.
LOGNAME Der Loginname des Users.
MACHTYPE Der Maschinentyp, er enthält meistens zusätzlich den Namen des Betriebssystems sowie der Distribution. Übliche Werte sind i586-debian-linux oder i386-unknown-linux.
MAIL Enthält den Pfad zur Mailbox, damit die Shell die Meldung "You have new mail!" ausgeben kann. Einige Mailprogramme benutzen sie ebenfalls zur Lokalisierung der Mailbox.
RANDOM Liefert eine Pseudo-Zufallszahl. Wird dieser Variablen eine Zahl zugewiesen, so wird damit der Zufallszahlengenerator initialisiert.
UID Die User-ID des aktuellen Benutzers oder Skriptes.

Wichtige Variablen

Folgende Variablen enthalten ebenfalls wichtige Informationen über das System, sie können bzw. sollen jedoch vom Anwender bearbeitet werden.

EDITOR Viele Programme, die irgendwann einen Editor aufrufen, schauen zuerst in dieser Variablen nach bevor sie den Default-Editor, nämlich den vi, starten.
CDPATH Analog zu PATH wird diese Liste vom "cd"-Befehl benutzt, um nach Verzeichnissen zu suchen, wenn das, in das der Benutzer wechseln möchte, kein Unterverzeichnis des aktuellen ist.
COLUMNS Enthält die Anzahl der Spalten auf dem Bildschirm bzw. Terminal.
DISPLAY Wird mit dem X Window System gearbeitet, dann beinhaltet diese Variable den Namen des Ausgabebildschirms, z.B. "kuolema:0.0".
LINES Enthält die Anzahl der Zeilen auf dem Bildschirm bzw. Terminal.
PATH Eine mit Doppelpunkten getrennte Liste, in denen nach Programmen gesucht wird, wenn kein Pfad vorangestellt wird (Tippe "ls" und die Shell findet es als "/bin/ls".
PS1 Enthält die Beschreibung des normalen Promptes, PS2 den des zweiten, ... PS4 den des vierten. In der "tcsh" heißt diese Variable einfach "prompt".
TERM Entspricht der Terminalemulation aus der termcap- bzw. terminfo-Datenbank (auf der Console ist das "linux", in einem XTerm "xterm")

Um in einer Netzwerkumgebung einen informativen Prompt zu haben, bieten sich bei der bash folgende Zuweisungen an:

   PS1=\h!\u(`tty|cut -d/-f 3`):\w>
   PS2=\#> 

  
Der normale Prompt enthält dann sowohl Rechner- als auch den Usernamen, sowie ein Kürzel des aktuellen Terminals und den aktuellen Pfad relativ zum Homeverzeichnis. Der zweite Prompt hingegen enthält die Nummer des zu beendenden Befehls.

   finlandia!joey(ttyS1):~/Mail> 

  

Spezielle Variablen

In der bash sind eine Reihe von speziellen Variablen definiert, die hauptsächlich in der Skriptprogrammierung Anwendung finden. Natürlich können diese nicht direkt geändert werden, sie spiegeln gewisse Zustände des Systems wieder.

$$ Wird zur aktuellen Prozeß-ID erweitert und kann daher für eindeutige temporäre Dateinamen verwendet werden.
$# Enthält die Anzahl der Kommandozeilenparameter, mit denen das Skript oder Funktion aufgerufen wurde.
$0 Enthält den Namen des aufgerufenen Skriptes.
$1 Der erste Parameter des Skriptes, $9 enthält den letzten.
$9 Wenn das Skript mit mehr als 9 Argumenten aufgerufen wurde, kann die Liste der Variablen mit dem Befehl "shift" um eine Stelle nach rechts verschoben werden, sodaß $1 rausfällt und $2 zu $1 wird. Die Abbildung verdeutlicht das.
$* Enthält alle Parameter aneinandergekettet, durch $IFS
$@ getrennt, "$@" expandiert jedoch nicht zu einer einzigen Zeichenkette, sondern zu einer Liste von Zeichenketten.
$? Diese Variable enthält den Rückgabewert des zuletzt ausgeführten Befehls.
$! Die Prozeßnummer des zuletzt ausgeführten Befehls, der mit & aufgerufen wurde und daher im Hintergrund abgearbeitet wird.
$_ Enthält das letzte Argument des zuletzt ausgeführten Befehls.

Beispiel:

   unterprogramm_aufruf
   if [ $? -ne 0 ]; then
     echo "Es ist ein Fehler aufgetreten."
   fi
  
Martin Schulze

Quelle: Linux-Special vom Toolbox-Verlag '97


© Joey, 26 Dec '97