eval: Unterschied zwischen den Versionen

Aus Mikiwiki
Zur Navigation springen Zur Suche springen
(New page: Über den Shell-Befehl <b>eval</b> können der Shell übergebene Argumente als Befehle übergeben werden, die von der Shell ausgeführt werden. Auf diese Weise werden die Aufrufarg...)
 
Keine Bearbeitungszusammenfassung
Zeile 55: Zeile 55:




{{cat|Kontrollfluss}}
{{cat|Linux}}
{{cat|Linux}}
{{cat|Shell-Befehl}}
{{cat|Shell-Befehl}}

Version vom 10. Januar 2009, 01:14 Uhr

Über den Shell-Befehl eval können der Shell übergebene Argumente als Befehle übergeben werden, die von der Shell ausgeführt werden. Auf diese Weise werden die Aufrufargumente zweimal von der Shell verarbeitet:

  • Das erste Mal, wenn die Shell die eval-Befehlszeile bearbeitet.
  • Das zweite Mal, wenn die Shell die bearbeiteten Aufrufargumente als Befehl ausführt. Die Shell bearbeitet jede Befehlszeile vor der Ausführung.

Die Shell bearbeitet jede Befehlszeile in mehreren Schritten. Bei jedem Bearbeitungsschritt interpretiert die Shell bestimmte Sonderzeichen. Die ursprüngliche Befehlszeile kann sich durch die Bearbeitungsschritte verändern. Wenn die Shell beispielsweise eine Variable durch ihren Wert oder einen Befehl durch seine Ausgabe ersetzt, können in der Befehlszeile Sonderzeichen auftreten, welche die Shell in den restlichen Bearbeitungsschritten nicht mehr interpretiert. Der eingebaute Befehl eval sorgt dafür, dass die Shell verbliebene Sonderzeichen im zweiten Durchgang interpretiert.

Als Argument kann eine beliebige Zeichenkette übergeben werden, die durch Leer- oder Tabulatorzeichen begrenzt wird. Das letzte Argument wird durch ein Befehlstrennzeichen abgeschlossen. Es können beliebig viele Argumente angegeben werden, jeweils getrennt durch mindestens ein Leer- oder Tabulatorzeichen. Die Shell führt diese Argumente als Befehle aus.

Verwendung

Die Shell ersetzt die Variable "kom" durch ihren Wert. Nach der Variablenersetzung erkennt die Shell den Strichpunkt ";" nicht mehr als Befehlstrennzeichen. Bei Aufruf mit eval interpretiert die Shell den Strichpunkt ";" wie gewünscht, weil sie das Aufrufargument "$kom" zweimal bearbeitet.

$ kom='date;who'
$ $kom
bash: date;who: command not found
$ eval $kom
Fr Mär  2 22:58:48 CET 2007
abc      :0           2007-02-12 23:22 (console)
abc      tty1         2007-02-23 10:37
...

Beispiel

Das Skript "evaltest" soll zeigen, wie der Befehl eval von der Shell abgearbeitet wird.

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

"set -x" bewirkt, dass die das Shellskript ausführende Shell die bearbeiteten Befehle vor der Ausführung auf die Standardfehlerausgabe schreibt.

$ sh evaltest
+ kennung=max
+ for i in 1 2 3 4
+ eval gruppe1=max1
++ gruppe1=max1
+ eval echo '$gruppe1'
++ echo max1
...

Nach dem ersten Schleifendurchlauf ist zu sehen:

  • Zeile 3 ("+ eval gruppe1=max1") zeigt die Bearbeitung der ersten eval-Befehlszeile: 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 Variablenname, 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 Zeichens "$" kein erlaubter Variablenname.
  • Zeile 4 ("gruppe1=max1") zeigt die Ausführung der Zuweisung. Bei der zweiten Bearbeitung der Aufrufargumente interpretiert die Shell das Gleichheitszeichen wie gewünscht, weil das Argument vor "=" ein erlaubter Name für eine Shellvariable ist.
  • Zeile 5 ("+ eval echo '$gruppe1'") zeigt die Bearbeitung der zweiten eval-Befehlszeile: 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 6 ("++ echo max1") zeigt die Bearbeitung des Befehls echo. Hier hat die Shell "$gruppe1" durch den Wert "max1" ersetzt.
  • Zeile 7 ("++ echo max1") enthält die Ausgabe des Befehls echo.

Weblinks

Vorlage:enwi