Que pouvez-vous faire avec la commande eval
? Pourquoi est-elle utile ? Est-ce une sorte de fonction intégrée dans bash ? Il n'y a pas de page man
pour cela...
eval
fait partie de POSIX. C'est une interface qui peut être intégrée au shell.
Elle est décrite dans le "POSIX Programmer's Manual" : http://www.unix.com/man-page/posix/1posix/eval/
eval - construct command by concatenating arguments
Il prend un argument et en construit une commande qui sera exécutée par le shell. Voici l'exemple de la page de manuel :
1) foo=10 x=foo
2) y='$'$x
3) echo $y
4) $foo
5) eval y='$'$x
6) echo $y
7) 10
$foo
avec la valeur '10'
et $x
avec la valeur 'foo'
.$y
, qui consiste en la chaîne de caractères '$foo'
. Le signe dollar doit être échappé
avec '$'
.echo $y
.'$foo'
.eval
. Il évaluera d'abord $x
à la chaîne 'foo'
. Maintenant nous avons l'instruction y=$foo
qui sera évaluée en y=10
.echo $y
est maintenant la valeur '10'
.Il s'agit d'une fonction courante dans de nombreux langages, par exemple Perl et JavaScript. Jetez un coup d'oeil à perldoc eval pour plus d'exemples : http://perldoc.perl.org/functions/eval.html
Oui, eval
est une commande interne à bash, elle est donc décrite dans la page de manuel bash
.
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.
Elle est généralement utilisée en combinaison avec une [Substitution de commande] (https://en.wikipedia.org/wiki/Command_substitution). Sans une eval
explicite, l'interpréteur de commandes essaie d'exécuter le résultat d'une substitution de commande, et non de l'évaluer.
Disons que vous voulez coder un équivalent de VAR=valeur ; echo $VAR
. Notez la différence dans la façon dont l'interpréteur de commandes traite les écritures de echo VAR=value
:
andcoz@...:~> $( echo VAR=value )
bash : VAR=valeur : commande non trouvée
andcoz@...:~> echo $VAR
<ligne vide>
Le shell tente d'exécuter echo
et VAR=value
comme deux commandes distinctes. Il jette une erreur au sujet de la deuxième chaîne. L'affectation reste sans effet.
2.
andcoz@...:~> eval $( echo VAR=valeur )
andcoz@...:~> echo $VAR
valeur
Le shell fusionne (concatène) les deux chaînes echo
et VAR=valeur
, analyse cette unité unique selon les règles appropriées et l'exécute.
Enfin et surtout, eval
peut être une commande très dangereuse. Toute entrée à une commande eval
doit être soigneusement vérifiée pour éviter les problèmes de sécurité.
eval
n'a pas de page de manuel parce que ce n'est pas une commande externe séparée, mais plutôt une commande intégrée à l'interpréteur de commandes, c'est-à-dire une commande interne à l'interpréteur de commandes (bash
) et connue seulement par lui. La partie pertinente de la page de manuel de bash
dit :
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
En outre, la sortie si help eval
est :
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
est une commande puissante et si vous avez l'intention de l'utiliser, vous devez être très prudent pour éviter les risques de sécurité qui l'accompagnent.