environment



Wir haben bis jetzt folgende Möglichkeit kennengelernt wie ein Programm zu seinen Eingaben kommt:

* Argumente und Switches die es auf der Kommandline bekommt z.B.:

ls -l /tmp

* lesen von STDIN:

z.B.:
cat blabla.txt | grep blibli

Zusätzlich zu diesen 2 Eingaben gibt es noch eine wichtige Dritte:

ENVIRONMENT Variablen.

Das ist eine Liste von Zuordnungen folgender Art:

NAME=wert

Wenn du auf der Bash

set

eingibst, siehst du eine lange Liste dieser Zuordnungen, die deine gegenwärtige Shell verwalten. Diese NAMEN sind sogenannte Environmentvariablen. Man kann sie beliebig setzten:
z.B.

set TEST=blabla

oder einfach nur einitppen:

TEST=blabla

Das setzt die Variable TEST mit dem Inhalt "blabla". Die Befehle zum Setzen der Variablen sind in den verschiedenen Shells leicht unterschiedlich, das Konzept der Environmentvariablen an sich aber, ist das selbe. Wir behandeln hier nur die Bash.

Du kannst den Inhalt der Variable anschauen mit:

echo $TEST

Dabei ersetzt die Shell, nachdem du das Kommando eingegeben hast, die Variable $TEST durch deren Inhalt und ruft erst dann das Programm "echo" auf, das dann nur noch den von der Shell eingesetzten Text ausgeben muss.

Manche "environement" Variablen haben für die Shell selbst Bedeutung. So z.B. die Variable "PS1" die den normalen "promp" (also den Text, den du am Anfang jeder Kommandozeile siehst) festlegt. Will man, dass die Shell beim Aufruf von Programmen die Variablen an diese übergibt so müssen diese Variablen als exportierbar gesetzt werden.

Einen Teil dieser Environmentvariablen können auch alle Programme abfragen, dazu müssen die Variablen "exportiert werden":

export TEST="max meier"

(Wir brauchen hier die Anführungszeichen weil wir in dem Wert den wir zuweisen ein Leerzeichen drinnen haben.)

Wenn du
export -p

aufrufst, bekommst du eine Liste aller exportierten Variablen.

(Wenn du nun z.B. eine zweite Bash "über" der aktuellen startest:

bash

und du

echo $TEST

eintippst, so ist der Wert immer noch verfügbar. Das Programm hat diese Environment-Variable quasi "geerbt" ebenso wie alle anderen Programme die von dieser Shell gestartet werden.)

Hilfen zu den Befehlen "set" und "export" bekommst du nicht über "man", sondern, weil diese Befehle in der Bash direkt eigebaut sind, über die Hilfe-Funktion der Bash:

help set

help export

Du kannst beim Zuweisen von Werten auch rechnen. Das geht mit dem Bash-Befehl "let".

let TEST=7*8*9+2

echo $TEST

ergibt: 506

Wozu das Ganze?

Hier ein paar nützliche Environment-Variablen:

TERM gibt den namen den Typ des aktuellen Terminals an. Wenn du z.B. ein "telnet" von Windows oder alten Terminals machst, passiert es manchmal, dass bei interaktiven Programmen wie "mutt" oder "pine" oder beim Editor die Zeichen nicht richtig dargestellt werden und Zeilen durcheinander kommen. Da ist meist der Terminal-Typ falsch.

Du gibst ein:

export TERM=vt100

und danach:

reset

Das "reset" setzt alle Terminal Eigenschaften anhand der TERM Variable und vt100 ist der kleinste gemeinsame Nenner, der fast überall funktioniert...

("reset" ist auch nützlich einzutippen, wenn dein Terminal mal durcheinandergeraten ist.. das Löscht den Bildschirm und setzt wieder eine lesbare Schrift...)

Eine andere nützliche Variable ist "EDITOR". Sie sollte den Namen und Pfad deines Lieblingseditors enthalten. Also z.B. /usr/bin/joe

export EDITOR=/usr/bin/joe

Diese Zuweisung ist natürlich nur in der aktuellen Shell gültig. Will man jedesmal beim Einloggen diese Einstellung der Variablen gesetzt haben, so schreiben wir diese Befehle am Besten in eines der Files die beim Starten ausgeführt werden.

Das wären:

/etc/profile (wird für jede Login-Shell aufgerufen; systemweit für alle user)

Im Homeverzeichnis:

.bash_profile (wird für Login-Shells (denjenigen, bei denen man neu eingelogt hat, aufgerufen.)

.bashrc (wird für jede neue Bash aufgerufen, ausser für Login-Shells)

üblicherweise will man die EDITOR-Einstellung z.B. in jeder Shell. Man schreibt sich daher in die .bashrc (Mithilfe eines Editors) z.B.:

export EDITOR=/usr/bin/joe

und ruft dann im ".bash_profile" das ".bashrc" auf (damit man es nicht zweimal eintragen muss)

im ".bash_profile" eine Zeile mit

. ~/.bashrc

(Der Punkt am Anfang und dann Zwischenraum, heisst, dass das File includiert werden soll)

Den Wert einer Variable "NAME" kannst du - wie gesagt - mit $NAME abfragen. Alternativ geht auch ${NAME} das ist nützlich, wenn du beim Ausgeben keine Zwischenräume haben willst. z.B.:

echo X${TEST}X

würde den Wert von TEST zwischen zwei X gesezt darstellen, was sonst nicht ginge...

So, jetzt setzen wir uns noch den "prompt" der Bash neu:

PS1="h:w$ "

setzt einen Prompt. Die Buchstaben "h" und "w" werden von der Bash durch die Werte des Hostnames und des Verzeichnis ersetzt. Will man auch noch den Usernamen haben, schreibt man z.b:

PS1='u@h:w$ '

Das "$" wird für "root" durch ein "#" ersetzt, Für alle anderen durch ein "$".

Mit

PS1='blabla '

hätte man einfach den Text "blabla " als Prompt.

EXERCISES:

* Versuche mit dem "set" Befehl Environment-Variablen zu setzen und diese dann mit der $NAME Substitution der Shell wieder abzufragen.

* Verwende den "let" Befehl zum Rechnen.

* Exportiere mit dem Befehl "export" Variablen, dann starte eine Subshell (einfach "bash" in der Shell aufrufen) und schau, ob du die Variablen immer noch abfragen kannst.

* Experimentiere mit PS1 und setz dir einen schönen aussagekräftigen Prompt. Trage diesen und die Einstellung für "EDITOR" in dein ".bashrc" ein. Stell sicher, dass die ".bashrc" auch im ".bash_profile" inkludiert wird.


REFERENCES:

help set
help export
help declare


man bash