2011-01-12 20 views

Respuesta

67

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 
+5

¿Cómo hacer 'eval" $ cmd "' sin escribir 'eval'?' $ ($ Cmd) '?' $ {$ Cmd} '? –

+2

@StevenLu, ninguno de esos es equivalente - intencionalmente tan: Un' eval 'operación analiza datos como sintaxis, por lo tanto, es muy sensible a la seguridad, y hacerlo implícitamente sería muy mala. –

-2

creo yu poner `símbolos alrededor de la variable (el que tiene ~ si se presiona Shift)

+3

Esto ejecuta la salida del comando, que p. en el caso de ls -l generará un mensaje como el comando "total" no encontrado "(porque el total ... es parte de la salida de ls -l, por ejemplo) Entonces esto NO es lo que quiere. –

3

Si usted acaba de hacer eval $cmd cuando hacemos cmd="ls -l" (de forma interactiva y en guiones) se obtiene la resultado deseado. En su caso, tiene una tubería con un grep sin patrón, por lo que la parte grep fallará con un mensaje de error. Solo $cmd generará un mensaje de "comando no encontrado" (o algo así). Así que intente usar eval y use un comando terminado, no uno que genere un mensaje de error.

+0

Fue solo error de imprenta .Debería ser "excepción grep". –

+0

luego use eval, no $ cmd por sí mismo, ya que probablemente no funcione (no lo hizo en mis pruebas, bajo bash y zsh). Esto es lo que eval debe hacer ... –

Cuestiones relacionadas