Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

eval - Aufruf-Argumente bearbeiten und als Kommando ausführen

&pagelevel(4)&pagelevel

(construct command by concatenating arguments)


Mit dem in die POSIX-Shell sh eingebauten Kommando eval können Sie der Shell sh die angegebenen Aufruf-Argumente als Kommando übergeben. Die Shell führt dieses Kommando aus.

Auf diese Weise werden die Aufruf-Argumente zweimal von der Shell bearbeitet:

  • das erste Mal, wenn die Shell die eval-Kommandozeile bearbeitet.

  • das zweite Mal, wenn die Shell die bearbeiteten Aufruf-Argumente als Kommando ausführt. Die Shell bearbeitet jede Kommando-Zeile vor der Ausführung.

Wann brauchen Sie eval?

Die Shell bearbeitet jede Kommando-Zeile in mehreren Schritten (siehe Abschnitt "Ausführung"). Bei jedem Bearbeitungsschritt interpretiert die Shell bestimmte Sonderzeichen. Die ursprüngliche Kommando-Zeile kann sich durch die Bearbeitungsschritte verändern.

Wenn die Shell beispielsweise eine Variable durch ihren Wert oder ein Kommando durch seine Ausgabe ersetzt, können in der Kommando-Zeile Sonderzeichen auftreten, die die Shell in den restlichen Bearbeitungsschritten nicht mehr interpretiert. Das eingebaute sh-Kommando eval sorgt dafür, dass die Shell verbliebene Sonderzeichen im zweiten Durchgang interpretiert (siehe Beispiele).


Syntax


eval [argument ...]

argument

beliebige Zeichenkette, die durch Leer- oder Tabulatorzeichen begrenzt wird. Das letzte Argument wird durch ein Kommando-Trennzeichen abgeschlossen. Sie können beliebig viele Argumente angeben, jeweils getrennt durch mindestens ein Leer- oder Tabulatorzeichen.

Die Shell führt diese Argumente als Kommando aus.

Internationale Umgebung

Die folgenden Umgebungsvariablen beeinflussen die Ausführung des Kommandos eval:

LANG

Gibt einen Standardwert für die Variablen für die internationale Umgebung an, die nicht gesetzt oder Null sind. Ist LANG nicht gesetzt oder Null, wird der entsprechende Standardwert der internationalen Umgebung verwendet. Enthält eine der Internationalisierungsvariablen eine ungültige Einstellung, verhält sich das Kommando so, als sei keine der Variablen definiert worden.

LC_ALL

Ist diese Variable auf einen Wert gesetzt, d. h. ist sie nicht leer, überschreibt dieser Wert die Werte aller übrigen Internationalisierungsvariablen.

LC_CTYPE

Legt die internationale Umgebung für die Interpretation der Byte-Folgen eines Datentexts als Zeichen fest (z.B. Singlebytezeichen im Unterschied zu Mehrbytezeichen in Argumenten und Eingabedateien) sowie die Einteilung der Zeichen in Groß- und Kleinbuchstaben und deren Übereinstimmung.

LC_MESSAGES

Legt die internationale Umgebung für Format und Inhalt der Diagnosemeldungen fest, die in die Standardfehlerausgabe geschrieben werden.

NLSPATH

Legt den Pfad der Meldungsdateien für LC_MESSAGES fest.

Beispiel 1

Die folgende Kommando-Zeile wird nur mit eval wie gewünscht ausgeführt:


$ kom='date;echo name'
$ $kom

sh:date;echo: not found

$ eval $kom
Mon Mar 09 15:46:02 MEZ 2009

name


Die Shell ersetzt die Variable kom durch ihren Wert. Nach der Variablen-Ersetzung erkennt die Shell den Strichpunkt ; nicht mehr als Kommando-Trennzeichen. Bei Aufruf mit eval interpretiert die Shell den Strichpunkt ; wie gewünscht, weil sie das Aufruf-Argument $kom zweimal bearbeitet.

Beispiel 2

Die Shell-Prozedur evaltest soll zeigen, wie das Kommando eval von der Shell abgearbeitet
wird. Sie hat folgenden Inhalt:

set -x
kennung=max
for i in 1 2 3 4
do
  eval gruppe$i=$kennung$i
  eval echo \$gruppe$i
done


set -x bewirkt, dass die Shell, die die Shell-Prozedur ausführt, die bearbeiteten Kommandos vor der Ausführung auf die Standard-Fehlerausgabe schreibt.

Wenn Sie diese Shell-Prozedur ausführen, erhalten Sie am Bildschirm folgende Ausgabe, allerdings ohne Zeilennummern:


   $ sh evaltest

1  + kennung=max

2  + eval gruppe1=max1
3  + gruppe1=max1

4  + eval echo $gruppe1

5  + echo max1
6  max1

:


Hier ist nur die Ausgabe nach dem ersten Schleifendurchlauf gezeigt.

Zeile 2 zeigt die Bearbeitung der ersten eval-Kommandozeile:
Die Shell hat $i durch den Wert 1 und $kennung durch den Wert max ersetzt. Der Aufruf mit eval ist nötig, weil die Shell im ersten Durchgang das Gleichheitszeichen nicht als Zeichen für Zuweisung erkennt. Die Shell führt eine Zuweisung nur aus, wenn der Variablen-Name, also die Zeichenkette vor dem Gleichheitszeichen = mit einem Buchstaben oder Unterstrich _ beginnt und nur Buchstaben, Ziffern und Unterstriche enthält. gruppe$i ist wegen des Dollarzeichens $ kein erlaubter Variablen-Name.

Zeile 3 zeigt die Ausführung der Zuweisung:
Bei der zweiten Bearbeitung der Aufruf-Argumente interpretiert die Shell das Gleichheitszeichen wie gewünscht, weil das Argument vor = ein erlaubter Name für eine Shell-Variable ist.

Zeile 4 zeigt die Bearbeitung der zweiten eval-Kommandozeile:
Die Shell hat den Stellungsparameter $i durch den Wert 1 ersetzt und das Entwertungszeichen \ vor $ entfernt. Hier ist eval nötig, damit die Shell die Variable gruppe1 durch ihren Wert ersetzt.

Zeile 5 zeigt die Bearbeitung des Kommandos echo:
Hier hat die Shell $gruppe1 durch den Wert max1 ersetzt. Zeile 6 enthält die Ausgabe des Kommandos echo.

Siehe auch

set