¿Qué se puede hacer con el comando eval
? ¿Por qué es útil? ¿Es algún tipo de función incorporada en bash? No hay una página man
para ello..
eval
es parte de POSIX. Es una interfaz que puede ser incorporada al shell.
Está descrita en el "POSIX Programmer's Manual': http://www.unix.com/man-page/posix/1posix/eval/
eval - construct command by concatenating arguments
Tomará un argumento y construirá un comando del mismo, que será ejecutado por el shell. Este es el ejemplo de la página man:
1) foo=10 x=foo
2) y='$'$x
3) echo $y
4) $foo
5) eval y='$'$x
6) echo $y
7) 10
$foo
con el valor '10'
y $x
con el valor 'foo'
.$y
, que consiste en la cadena '$foo'
. El signo de dólar debe escaparse
con '$'
.echo $y
.'$foo'
.eval
. Primero evaluará $x
a la cadena 'foo'
. Ahora tenemos la sentencia y=$foo
que se evaluará a y=10
.echo $y
es ahora el valor '10'
.Esta es una función común en muchos lenguajes, por ejemplo, Perl y JavaScript. Echa un vistazo a perldoc eval para ver más ejemplos: http://perldoc.perl.org/functions/eval.html
Sí, eval
es un comando interno de bash por lo que se describe en la página man de 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.
Normalmente se utiliza en combinación con una Sustitución de Comandos. Sin un eval
explícito, el shell intenta ejecutar el resultado de una sustitución de comando, no evaluarlo.
Digamos que quiere codificar un equivalente de VAR=valor; echo $VAR
. Observe la diferencia en cómo el shell maneja las escrituras de echo VAR=valor
:
andcoz@...:~> $( echo VAR=valor )
bash: VAR=valor: comando no encontrado
andcoz@...:~> echo $VAR
<línea vacía>
El shell intenta ejecutar echo
y VAR=valor
como dos comandos separados. Arroja un error sobre la segunda cadena. La asignación queda sin efecto.
2.
andcoz@...:~> eval $( echo VAR=valor )
andcoz@...:~> echo $VAR
valor
El shell fusiona (concatena) las dos cadenas echo
y VAR=valor
, analiza esta unidad única según las reglas apropiadas y la ejecuta.
Por último, pero no menos importante, eval
puede ser un comando muy peligroso. Cualquier entrada a un comando eval
debe ser cuidadosamente revisada para evitar problemas de seguridad.
eval
no tiene página de manual porque no es un comando externo separado, sino un comando incorporado al shell, es decir, un comando interno y conocido sólo por el shell (bash
). La parte relevante de la página de manual de bash
dice:
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
Además, la salida si help eval
es:
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
es un comando muy potente y si tienes intención de utilizarlo debes tener mucho cuidado con los posibles riesgos de seguridad que conlleva.