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