Was kann man mit dem Befehl eval
machen? Warum ist er nützlich? Ist es eine Art eingebaute Funktion in der Bash? Es gibt keine "man"-Seite für diesen Befehl.
eval" ist Teil von POSIX. Es ist eine Schnittstelle, die in eine Shell eingebaut werden kann.
Es wird im "POSIX Programmer's Manual" beschrieben: http://www.unix.com/man-page/posix/1posix/eval/
eval - construct command by concatenating arguments
Es nimmt ein Argument und konstruiert daraus einen Befehl, der von der Shell ausgeführt wird. Dies ist das Beispiel für die Manpage:
1) foo=10 x=foo
2) y='$'$x
3) echo $y
4) $foo
5) eval y='$'$x
6) echo $y
7) 10
$foo
mit dem Wert '10'
und $x
mit dem Wert 'foo'
.$y
, das aus der Zeichenkette '$foo'
besteht. Das Dollarzeichen muss mit einem Escape versehen werden
mit '$'
.echo $y
.'$foo'
sein.eval
. Es wird zuerst $x
zu der Zeichenkette 'foo'
auswerten. Jetzt haben wir die Anweisung y=$foo
, die zu y=10
ausgewertet wird.echo $y
ist nun der Wert '10'
.Dies ist eine übliche Funktion in vielen Sprachen, z.B. Perl und JavaScript. Schauen Sie sich perldoc eval für weitere Beispiele an: http://perldoc.perl.org/functions/eval.html
Ja, eval
ist ein interner Bash-Befehl und wird in der bash
-Manualseite beschrieben.
eval [arg ...]
The args are read and concatenated together into a single com-
mand. This command is then read and executed by the shell, and
its exit status is returned as the value of eval. If there are
no args, or only null arguments, eval returns 0.
Normalerweise wird es in Kombination mit einer Command Substitution verwendet. Ohne ein explizites eval
versucht die Shell, das Ergebnis einer Befehlssubstitution auszuführen, nicht auszuwerten.
Nehmen wir an, Sie wollen ein Äquivalent zu VAR=Wert; echo $VAR
programmieren. Beachten Sie den Unterschied in der Art und Weise, wie die Shell das Schreiben von "echo VAR=Wert" behandelt:
andcoz@...:~> $( echo VAR=Wert )
bash: VAR=value: Befehl nicht gefunden
andcoz@...:~> echo $VAR
<leere Zeile>
Die Shell versucht, echo
und VAR=value
als zwei separate Befehle auszuführen. Sie wirft einen Fehler bezüglich der zweiten Zeichenkette. Die Zuweisung bleibt unwirksam.
2.
andcoz@...:~> eval $( echo VAR=Wert )
andcoz@...:~> echo $VAR
Wert
Die Shell fügt die beiden Zeichenketten echo
und VAR=Wert
zusammen (konkateniert), analysiert diese Einheit nach den entsprechenden Regeln und führt sie aus.
Zu guter Letzt kann eval
ein sehr gefährlicher Befehl sein. Jede Eingabe in einen eval
-Befehl muss sorgfältig geprüft werden, um Sicherheitsprobleme zu vermeiden.
eval" hat keine Manpage, weil es kein separates externes Kommando ist, sondern ein eingebautes Kommando der Shell, d.h. ein Kommando, das nur in der Shell (bash
) bekannt ist. Der relevante Teil der bash
-Manualseite sagt:
eval [arg ...]
The args are read and concatenated together into a single command.
This command is then read and executed by the shell, and its exit
status is returned as the value of eval. If there are no args, or only
null arguments, eval returns 0
Außerdem lautet die Ausgabe von help eval
:
eval: eval [arg ...]
Execute arguments as a shell command.
Combine ARGs into a single string, use the result as input to the shell,
and execute the resulting commands.
Exit Status:
Returns exit status of command or success if command is null.
eval
ist ein mächtiger Befehl und wenn Sie ihn benutzen wollen, sollten Sie sehr vorsichtig sein, um die möglichen Sicherheitsrisiken, die damit einhergehen, zu vermeiden.