Las shells Unix operan una serie de transformaciones en cada línea de entrada antes de ejecutarlas. Para la mayoría de las cáscaras se ve algo como esto (tomado de la bash
página del manual):
- palabra inicial división
- expansión de llaves
- expansión de tilde
- parámetros, variables y expansión aritmética comando
- sustitución
- separación de palabras secundaria
- ruta e Xpansion (también conocido como comodines)
- eliminación de comillas
Usando $cmd
directamente se lo reemplazó por su comando durante la fase de expansión de parámetros, y luego se somete a los siguientes transformaciones.
Usando eval "$cmd"
no hace nada hasta que la fase de eliminación de cita, donde $cmd
se devuelve como es, y pasa como un parámetro a eval
, cuya función es para ejecutar la cadena entera de nuevo antes de ejecutar.
Básicamente, son los mismos en la mayoría de los casos y difieren cuando su comando utiliza los pasos de transformación hasta la expansión de parámetros. Por ejemplo, usando la expansión de llaves:
$ cmd="echo foo{bar,baz}"
$ $cmd
foo{bar,baz}
$ eval "$cmd"
foobar foobaz
Consulte [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). –