lunes, 15 de marzo de 2010

Script: punto delante del script

En muchos scripts de linux es común usar el operandor punto (dot en inglés) de modo que la ejecucion queda asi:
$ . miscript.sh

¿Por qué se usa el .?

Con el punto estamos indicando que el script se ejecute en el shell actual. Esto implica que las variables que hemos modificado en este shell, serán visibles para el script.

Si no se usase, el script se ejecutará en un shell nuevo, donde no se conservan las variables. Al ser un shell nuevo

Del mismo modo, si ejecutamos el script con el . delante, todos los cambios de variables que ejecute el script (por ejemplo si cambiamos de directorio), serán visibles y se conservaran cuando acabe el script.

Ejemplo:

Supongamos que tenemos el siguiente script en el archivo script1.sh al que le damos permisos de ejecutación(chamod u+x script1.sh):
#!/bin/sh
echo $MENSAJE
MENSAJE='Mensaje script1'
echo $MENSAJE

Supongamos que estamos en una shell, y vamos a crear una variable llamada MENSAJE en la shell. Ejecutaremos el script1 con y sin punto y veremos que sale:
$>MENSAJE='ESTOY EN LA SHELL'
$> echo $MENSAJE
ESTOY EN LA SHELL
$> ./script1.sh

Mensaje script1
$>echo $MENSAJE
ESTOY EN LA SHELL
$>. ./script1.sh
ESTOY EN LA SHELL
Mensaje script1
$> echo $MENSAJE
Mensaje script1


En la primera ejecución de script1 sin el . :
1) Desconoce el valor de MENSAJE, dado que se ejecutan en una subshell que no hereda las variables de la shell. Así que escribe en primer lugar una linea en blanco
2) Al volver a la shell y ver el contenido de mensaje vemos que no se ha modificado (ESTOY EN LA SHELL)

En la segunda ejecución, con el . delante :
1) Imprime el contenido de MENSAJE que hay en la shell, dado que se ejecuta en el mismo espacio, y por tanto sí conoce la variable ( ya no imprime la linea en blanco)
2)Al volver a la shell, el script1 modificó el valor de la variable MENSAJE, y ahora aparece Mensaje script1.

El . como un include de C

Así pues el funcionamiento del . cuando lo incluimos dentro de nuestros scripts es algo similar a la cabecera include de C. Es decir es casi como si la linea que incluy ele script se sustituyese exactamente por su contenido (un copiar y pegar del código).

Por todo ello usar el . delante del script es imprescindible conocerlo y usarlo.

No hay comentarios: