188 votes

commande eval en Bash et ses utilisations typiques

Après avoir lu le bash pages man et à l’égard de ce poste.

J’ai encore des difficultés à comprendre ce qui exactement la `` commande des entités opérationnelles désignées et qui serait son utilisations typiques. Par exemple, si nous le faisons :

Ce qui se passe exactement ici et comment le signe du dollar et la barre oblique inverse égalité dans le problème ?

221voto

Gilles Points 37537

eval prend une chaîne de caractères comme argument, et l'évalue comme si vous aviez tapé cette chaîne sur une ligne de commande. (Si vous passez plusieurs arguments, ils sont d'abord rejoint avec des espaces entre eux.)

${$n} est une erreur de syntaxe bash. Entre les accolades, vous ne pouvez avoir un nom de variable, avec quelques préfixes et des suffixes, mais vous ne pouvez pas avoir d'arbitraire bash syntaxe et, en particulier, vous ne pouvez pas utiliser la variable d'expansion. Il y a une façon de dire "la valeur de la variable dont le nom est dans cette variable", mais:

echo ${!n}
one

$(…) exécute la commande spécifiée à l'intérieur des parenthèses dans un shell interne est exécuté (c'est à dire dans un processus distinct qui hérite de tous les paramètres tels que les valeurs des variables du shell courant), et regroupe de sa sortie. Donc, echo $($n) s'exécute $n comme une commande shell, et affiche sa sortie. Depuis $n évalue 1, $($n) tente d'exécuter la commande 1, ce qui n'existe pas.

eval echo \${$n} exécute les paramètres passés à l' eval. Après l'expansion, les paramètres sont echo et ${1}. Donc, eval echo \${$n} exécute la commande echo ${1}.

Notez que la plupart du temps, vous devez utiliser des guillemets autour de la variable de substitution et de commande susbtitutions (c'est à dire quand il y a un $): "$foo", "$(foo)". Toujours mettre des guillemets autour de la variable de commande et de substitution, sauf si vous savez que vous devez les laisser hors tension. Sans les guillemets, le shell exécute domaine de fractionnement (c'est à dire, il se divise la valeur de la variable ou le résultat de la commande en mots distincts), puis traite chaque mot comme un modèle générique. Par exemple:

$ ls
file1 file2 otherfile
$ set -- 'f* *'
$ echo "$1"
f* *
$ echo $1
file1 file2 file1 file2 otherfile
$ n=1
$ eval echo \${$n}
file1 file2 file1 file2 otherfile
$eval echo \"\${$n}\"
f* *
$ echo "${!n}"
f* *

eval n'est pas utilisé très souvent. Dans quelques coquilles, l'utilisation la plus courante est d'obtenir la valeur d'une variable dont le nom n'est pas connu avant l'exécution. En bash, ce n'est pas nécessaire grâce à l' ${!VAR} de la syntaxe. eval est toujours utile lorsque vous avez besoin de construire plus de commande contenant des opérateurs, des mots réservés, etc.

45voto

Hari Shankar Points 9405

Il suffit de penser eval "l'évaluation de votre expression d'un délai supplémentaire avant l'exécution"

eval echo \${$n} devient echo $1 après le premier cycle d'évaluation. Trois modifications sont à noter:

  • L' \$ est devenue $ (La barre oblique inverse est nécessaire, sinon, il essaie d'évaluer ${$n}, ce qui signifie qu'une variable nommée {$n}, ce qui n'est pas autorisé)
  • $n a été évaluée à l' 1
  • L' eval disparu

Au second tour, c'est fondamentalement echo $1 qui peut être exécuté directement.

Donc, eval <some command> allons d'abord évaluer <some command> (par évaluer ici, je veux dire remplacer les variables, remplacer des caractères d'échappement avec celles qui sont correctes, etc.), et puis exécutez la résultante de l'expression une fois de plus.

eval est utilisé lorsque vous souhaitez créer dynamiquement des variables, ou à lire des sorties de programmes spécifiquement conçus pour être lu comme ça. Voir http://mywiki.wooledge.org/BashFAQ/048 pour des exemples. Le lien contient également quelques exemples de façons dont eval est utilisé, et les risques qui y sont associés.

31voto

sootsnoot Points 354

Dans mon expérience, un "typique" utilisation de la fonction eval est pour l'exécution de commandes qui génèrent des commandes shell à définir des variables d'environnement.

Peut-être que vous avez un système qui utilise un ensemble de variables d'environnement, et vous avez un script ou un programme qui détermine ce qui doit être et de leurs valeurs. Chaque fois que vous exécutez un script ou d'un programme, il s'exécute dans un fork du processus, de sorte que tout ce qu'il ne directement à des variables d'environnement est perdu quand il sort. Mais que le script ou le programme peut envoyer les commandes d'exportation vers stdout.

Sans eval, vous devez rediriger stdout vers un fichier temporaire, source le fichier temporaire, puis de le supprimer. Avec eval, vous pouvez:

eval $(script-or-program)

12voto

Nikhil Gupta Points 19

L’instruction eval indique la coquille aux arguments de prendre d’eval commande et exécuter à travers la ligne de commande. Il est utile dans une situation comme ci-dessous :

Dans votre script si vous définissez une commande dans une variable et par la suite vous souhaitez utiliser cette commande puis utilisez eval :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X