3.6.3. Preevaluación de órdenes

Ya se ha dicho que la shell evalúa (o interpreta) la línea antes de ejecutarla. Por ejemplo, la orden:

$ ls -ld *

muestra todos los ficheros y directorios no ocultos que se encuentran en el directorio de trabajo, ya que el intérprete sustituye el asterisco por cualquier nombre de fichero, y directorio y es la lista de ficheros y directorios lo que proporciona a ls. Ahora bien, si protegemos el asterisco, obtendremos un error:

$ ls -ld "*"
ls: no se puede acceder a '*': No existe el fichero o el directorio

ya que no hay nada que se llame asterisco y eso es precisamente lo que se pasa a ls. La orden interna eval preevalúa la orden:

$ eval ls -ld "*"

Preevaluar la orden consiste en que la shell interprete la línea sin llegar a ejecutar la orden lo que, en este caso, se traduce en eliminar las comillas. Por lo tanto, al ejecutar eval lo que conseguimos es obtener ls -ld *, que es justamente la orden que primero pusimos. Tras la preevaluación, la orden es ejecutada por la shell y, como consecuencia, se interpretará el asterisco y ls mostrará todo el contenido del directorio.

El ejemplo no es muy útil, pero sirve para entender cómo funciona eval, que es útil en muchos casos. Por ejemplo:

#!/bin/sh

read -p "Escriba un valor para a: " a
read -p "Escriba un valor para b: " b
read -p "Escriba un valor para c: " c

read -p "¿Qué variable quiere ver? " r
eval echo $r vale \$$r