|
eval [Argumente]
Das Kommando eval liest seine Argumente, wobei die üblichen Ersetzungen stattfinden,
und führt die resultierende Zeichenkette als Kommando aus. Die Argumente der Kommandozeile werden von der Shell gelesen, wobei Variablen- und Kommandoersetzungen sowie Dateinamenersetzung durchgeführt werden. Die sich ergebende Zeichenkette wird anschließend erneut von der Shell gelesen, wobei wiederum die oben genannten Ersetzungen durchgeführt werden. Schließlich wird das resultierende Kommando ausgeführt. Beispiel (Ausgaben fett): $ A="Hello world!" $ X='$A'
$ echo $X
$A
$ eval echo $X
Hello world!
Der Rückgabestatus von eval ist der Rückgabestatus
des ausgeführten Kommandos oder 0, wenn keine Argumente angegeben wurden.
Ein weiteres Beispiel:
$ cat /etc/passwd | wc -l
76
$ foo='cat /etc/passwd'
$ bar=`| wc -l'
$ $foo $bar # Fehler: $bar ist Argument von cmdl
cat: | : No such file or directory
cat: wc: No such file or directory
cat: -l: No such file or directory
$ eval $foo $bar
76
In diesem Beispiel wird zunächst ein einfaches Kommando gestartet, das die Anzahl
der Zeilen der Datei /etc/passwd bestimmt. Anschließend werden die beiden Teile des
gesamten Kommandos in die zwei Shell-Variablen foo und bar aufgeteilt. Der erste
Aufrufversuch $foo $bar bringt nicht das gewünschte Ergebnis, sondern
lediglich einige Fehlermeldungen, da in diesem Fall der Wert von bar als Argument für
foo interpretiert wird ('cat' wird mit den Dateien '/etc/passwd', '|', 'wc' und '-l'
aufgerufen). Wird jedoch das Kommando eval auf die Argumente $foo und $bar angewendet,
werden diese zunächst zur Zeichenkette "cat /etc/passwd | wc -l" ersetzt.
Diese Zeichenkette wird dann durch das Kommando eval erneut von der Shell gelesen, die
jetzt das Zeichen "|" in der Kommandozeile als Pipesymbol erkennt und das Kommando
ausführt. Das Kommando eval wird üblicherweise dazu eingesetzt, eine
Zeichenkette als Kommando zu interpretieren, wobei zweifach Ersetzungen in den
Argumenten der Kommandozeile vorgenommen werden.
Eine andere Anwendung ist beispielsweise die Auswahl des letzen Parameters der
Kommandozeile. Mit \$$# erhält man die Parameterangabe (bei fünf Parametern
--> $5). Das erste Dollarzeichen wird von der Shell ignoriert (wegen des '\'),
$# hingegen ausgewertet. Durch eval wird der Ausdruck nochmals ausgewertet, man
erhält so den Wert des letzten Parameters:
eval \$$#
Aber Vorsicht, das klappt nur bei 1 - 9 Parametern, denn z. B. der 12. Parameter
führt zu $12 --> ${1}2. Es lassen sich mit eval sogar Pointer realisieren.
Falls die Variable PTR den Namen einer anderen Variablen, z. B. XYZ, enthält,
kann auf den Wert von XYZ durch eval $PTR zurückgegriffen werden, z. B. durch
eval echo \$$PTR.
|
|
|