2.9 Automatische Variablen der Shell
Nach dem Aufruf eines Shellscripts versorgt Sie die Shell außerdem noch durch einer Reihe von Variablen mit Informationen zum laufenden Prozess.
2.9.1 Der Name des Shellscripts – $0
Den Namen des aufgerufenen Shellscripts finden Sie in der Variablen $0. Bspw. folgendes Shellscript:
# Name : ichbin
echo "Mein Kommandoname ist $0"
Führen Sie dieses Script aus, bekommen Sie folgende Ausgabe zurück:
you@host > ./ichbin
Mein Kommandoname ist ./ichbin
you@host > $HOME/ichbin
Mein Kommandoname ist /home/you/ichbin
Diese Variable wird häufig für Fehlermeldungen verwendet, zum Beispiel um anzuzeigen, wie man ein Script richtig anwendet bzw. aufruft. Dafür ist selbstverständlich auch der Kommandoname von Bedeutung.
Hinweis Die Formulierung »den Namen des aufgerufenen Shellscripts« trifft die Sache eigentlich nicht ganz genau. Wenn man bspw. den Befehl in der Konsole eingibt, bekommt man ja den Namen der Shell zurück. Somit könnte man wohl auch vom Namen des Elternprozesses des ausgeführten Befehls echo sprechen. Aber wir wollen hier nicht kleinlich werden.
|
Mit dieser Variablen können Sie übrigens auch ermitteln, ob ein Script mit einem vorangestellten Punkt gestartet wurde und entsprechend darauf reagieren:
you@host > . ./ichbin
Mein Kommandoname ist /bin/bash
you@host > sh
sh-2.05b$ . ./ichbin
Mein Kommandoname ist sh
sh-2.05b$ ksh
$ . ./ichbin
Mein Kommandoname ist ksh
Wird also ein Shellscript mit einem vorangestellten Punkt aufgerufen, so enthält die Variable $0 den Namen des Kommando-Interpreters.
2.9.2 Die Prozessnummer des Shellscripts – $$
Die Variable $$ wird von der Shell durch die entsprechende Prozessnummer des Shellscripts ersetzt. Bspw. folgendes Shellscript:
# Name : mypid
echo "Meine Prozessnummer ($0) lautet $$"
Das Shellscript bei der Ausführung:
you@host > ./mypid
Meine Prozessnummer (./mypid) lautet 4902
you@host > . ./mypid
Meine Prozessnummer (/bin/bash) lautet 3234
you@host > ps
PID TTY TIME CMD
3234 pts/38 00:00:00 bash
4915 pts/38 00:00:00 ps
Durch ein Voranstellen des Punkte-Operators können Sie hierbei auch die Prozessnummer der ausführenden Shell bzw. des Kommando-Interpreters ermitteln.
2.9.3 Der Beendigungsstatus eines Shellscripts – $?
Diese Variable wurde bereits in Zusammenhang mit exit behandelt. In dieser Variablen finden Sie den Beendigungsstatus des zuletzt ausgeführten Kommandos (oder eben auch Shellscripts).
you@host > cat gibtesnicht
cat: gibtesnicht: Datei oder Verzeichnis nicht gefunden
you@host > echo $?
1
you@host > ls -l | wc -l
31
you@host > echo $?
0
Ist der Wert der Variablen $? ungleich 0, ist beim letzten Kommandoaufruf ein Fehler aufgetreten. Wenn $? gleich 0 ist, deutet dies auf einen fehlerlosen Kommandoaufruf hin.
2.9.4 Die Prozessnummer des zuletzt gestarteten Hintergrundprozesses – $!
Wenn Sie in der Shell ein Kommando oder ein Shellscript im Hintergrund ausführen lassen (&), wird die Prozessnummer in die Variable $! gelegt. Anstatt also nach der Nummer des zuletzt gestarteten Hintergrundprozesses zu suchen, können Sie auch einfach die Variable $! verwenden. Im folgenden Beispiel wird diese Variable verwendet, um den zuletzt gestarteten Hintergrundprozess zu beenden.
you@host > find / -print > ausgabe 2> /dev/null &
[1] 5845
you@host > kill $!
you@host >
[1]+ Beendet find / -print >ausgabe 2>/dev/null
2.9.5 Weitere vordefinierte Variablen der Shell
Es gibt noch weitere automatische Variablen der Shell, die allerdings erst in Kapitel 3, Parameter und Argumente, ausführlicher behandelt werden. Tabelle 2.10 gibt bereits einen Überblick.
Tabelle 2.10
Automatisch vordefinierte Variablen der Shell
Variable(n)
|
Bedeutung
|
$1 bis $n
|
Argumente aus der Kommandozeile
|
$*
|
Alle Argumente aus der Kommandozeile in einer Zeichenkette
|
$@
|
Alle Argumente aus der Kommandozeile als einzelne Zeichenketten (Array von Zeichenketten)
|
$#
|
Anzahl aller Argumente in der Kommandozeile
|
$_
|
(Bash only) Letztes Argument in der Kommandozeile des zuletzt aufgerufenen Kommandos
|
2.9.6 Weitere automatische Variablen für Bash und Korn-Shell
In diesem Abschnitt finden Sie noch weitere automatische Variablen der Shell. Sicherlich wird sich der ein oder andere dabei fragen, warum ich diese Variablen bei den automatischen und nicht bei den vordefinierten Shell-Variablen aufführe. Der Grund ist relativ einfach: Die folgenden Variablen werden von der Shell ständig neu gesetzt. Diese Variablen stehen Ihnen aber nur für die Bash und die Korn-Shell zur Verfügung. Bestes Beispiel, Ihnen dieses »ständig neu gesetzt« zu beschreiben, ist die automatische Variable RANDOM, welche mit einer Zufallszahl zwischen 0 bis 32767 belegt ist. Wäre dies eine vordefinierte Shell-Variable wie bspw. HOME, so würde sich der Wert dieser Variable ja nicht ändern. Wenn Sie RANDOM erneut verwenden, werden Sie feststellen, dass sich dieser Wert beim nächsten Aufruf in der Shell verändert hat – also wird diese Variable ständig neu gesetzt.
you@host > echo $RANDOM
23957
you@host > echo $RANDOM
13451
you@host > echo $RANDOM
28345
you@host > RANDOM=1
you@host > echo $RANDOM
17767
Hierzu finden Sie im Folgenden die Tabelle 2.11 bis Tabelle 2.13, die Ihnen weitere automatische Variablen vorstellen, die ständig von der Shell neu gesetzt werden.
Automatische Variablen für Bash und Korn-Shell
Tabelle 2.11
Ständig neu gesetzte Variablen (Bash und Korn-Shell)
Variable
|
Bedeutung
|
LINENO
|
Diese Variable enthält immer die aktuelle Zeilennummer im Shellscript. Wird die Variable innerhalb einer Scriptfunktion aufgerufen, entspricht der Wert von LINENO den bis zum Aufruf innerhalb der Funktion ausgeführten einfachen Kommandos. Außerhalb von Shellscripts ist diese Variable nicht sinnvoll belegt. Wird die LINENO-Shell-Variable mit unset gelöscht, kann sie nicht wieder mit ihrer automatischen Funktion erzeugt werden.
|
OLDPWD
|
Der Wert ist das zuvor besuchte Arbeitsverzeichnis; wird vom Kommando cd gesetzt.
|
OPTARG
|
Der Wert ist das Argument der zuletzt von getopts ausgewerteten Option.
|
OPTIND
|
Enthält die Nummer (Index) der zuletzt von getopts ausgewerteten Option
|
PPID
|
Prozess-ID des Elternprozesses (Parent Process ID = PPID); eine Subshell, die als Kopie einer Shell erzeugt wird, setzt PPID nicht.
|
PWD
|
Aktuelles Arbeitsverzeichnis
|
RANDOM
|
Pseudo-Zufallszahl zwischen 0 bis 32767; weisen Sie RANDOM einen neuen Wert zu, so führt dies dazu, dass der Zufallsgenerator neu initialisiert wird.
|
REPLY
|
Wird vom Shell-Kommando read gesetzt, wenn keine andere Variable als Rückgabeparameter benannt ist und bei Menüs (select) enthält REPLY die ausgewählte Nummer.
|
SECONDS
|
Enthält die Anzahl von Sekunden, die seit dem Start (Login) der aktuellen Shell vergangen ist. Wird SECONDS ein Wert zugewiesen, erhöht sich dieser Wert jede Sekunde automatisch um eins.
|
Automatische Variablen nur für die Korn-Shell
Tabelle 2.12
Ständig neu gesetzte Variable (Korn-Shell only)
Variable
|
Bedeutung
|
ERRNO
|
Fehlernummer des letzten fehlgeschlagenen Systemaufrufs
|
Automatische Variablen nur für die Bash
Tabelle 2.13
Ständig neu gesetzte Variablen (Bash only)
Variable
|
Bedeutung
|
BASH
|
Kompletter Pfadname der aktuellen Shell
|
BASH_VERSION
|
Versionsnummer der Shell
|
EUID
|
Beinhaltet die effektive Benutzerkennung des Anwenders. Diese Nummer wird während der Ausführung von Programmen, bei denen das SUID-Bit aktiviert ist, gesetzt.
|
HISTCMD
|
Enthält die Nummer des aktuellen Kommandos aus der Historydatei
|
HOSTTYPE
|
Typ des Rechners. Für Linux kommen u. a. die Typen i386 oder i486 in Frage.
|
OSTYPE
|
Name des Betriebssystems. Da allerdings die Variable OSTYPE den aktuellen Wert zum Übersetzungszeitpunkt der Bash anzeigt, ist dieser Wert nicht zuverlässig. Re-kompilieren Sie bspw. alles neu, ändert sich dieser Wert nicht mehr. Zuverlässiger ist da wohl das Kommando uname.
|
PROMPT_COMMAND
|
Hier kann ein Kommando angegeben werden, das vor jeder Eingabeaufforderung automatisch ausgeführt wird.
|
SHLVL
|
Steht für den Shell-Level. Bei jedem Aufruf einer neuen Shell in der Shell wird der Shell-Level um eins erhöht; der Wert 2 kann z. B. innerhalb eines Scripts bestehen, das aus einer Login-Shell gestartet wurde. Eine Möglichkeit, zwischen den Levels zu wechseln, gibt es nicht.
|
UID
|
Die User-ID des Anwenders. Diese Kennung ist in der Datei /etc/passwd dem Benutzernamen zugeordnet.
|
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|