En Bash, el comando . (punto) ejecuta un script Bash en el entorno actual. Usualmente Bash ejecuta un script (archivo de comandos Bash) en una subshell para que los cambios realizados en el entorno (por ejemplo utilizando los comandos cd, set, etc.) sean locales al script. Al utilizar una subshell, el script se ejecuta en un entorno separado, sin afectar el entorno actual. El comando punto cambia este comportamiento y logra que el script a ejecutar utilice el entorno actual.



Veamos un ejemplo rápido. Voy a crear un script Bash que simple cambie al directorio /tmp utilizando el comando cd:

[emi@hal9000 ~]$ nano test.sh
[emi@hal9000 ~]$ cat test.sh 
#!/bin/bash

cd /tmp

Luego le doy permisos de ejecución para poder ejecutarlo con cualquier usuario:

[emi@hal9000 ~]$ chmod +x test.sh 

El directorio de trabajo antes de ejecutar el script, tal como lo reporta el comando pwd o la variable de entorno $PWD, es /home/emi, correspondiente al directorio $HOME (~) del usuario actual (emi):

[emi@hal9000 ~]$ pwd
/home/emi

Luego de ejecutar el script, ¿cuál será el directorio de trabajo de la sesión actual?

[emi@hal9000 ~]$ ./test.sh 
[emi@hal9000 ~]$ pwd
/home/emi

Se observa que a pesar de que el script cambie el directorio de trabajo (cd /tmp), no se cambia el directorio de trabajo para la sesión actual. Es decir, no se ve afectado, el entorno de la sesión actual (no se modifica la variable $PWD del entorno actual). Por lo tanto, al finalizar la ejecución del script, el directorio de trabajo sigue siendo /home/emi.

Esto se debe a que Bash ejecuta el script en una nueva sesión, en lugar de utilizar la sesión actual.

Entonces, ¿qué pasa si ejecutamos el script utilizando punto?

[emi@hal9000 ~]$ . ./test.sh 
[emi@hal9000 tmp]$ pwd
/tmp

Tal como menciona el manual, punto hace que el script se ejecute en el entorno actual, por lo tanto todas las modificaciones que realiza en variables de entorno (en este caso en la variable $PWD) se ven reflejadas en la sesión actual.

Se observa que se ha modificado el directorio de trabajo de la sesión actual no sólo en la salida del comando pwd, sino también en el prompt de la sesión.

Un ejemplo más avanzado

Veamos ahora un ejemplo más avanzado. Al compartir el entorno no sólo los cambios que haga el script afectan a la sesión actual, sino que también el comportamiento del mismo puede ser diferente, debido a que puede acceder a todas las variables definidas previamente.

Supongamos un escenario donde un script "script1" invoca a otro script "script2". Y además deseo que la ejecución de "script1" no afecte el entorno actual, pero que "script2" comparta el entorno con "script1".

Estoy trabajando en el directorio /tmp/test:

root@debian6-lts:/tmp/test# pwd
/tmp/test

El "script1" define la variable var1, ejecuta a "script2" (sin utilizar punto), y luego muestra el directorio de trabajo actual:

root@debian6-lts:/tmp/test# cat script1
#!/bin/bash

var1="¡Hola Mundo!"

/tmp/test/script2

echo "Directorio actual:"

pwd

El "script2" muestra el contenido de la variable var1 y finalmente cambia al directorio raíz (/):

root@debian6-lts:/tmp/test# cat script2
#!/bin/bash

echo "Contenido de var1:"
echo $var1

cd /

Ambos scripts tienen permiso de ejecución.

Veamos qué sucede al ejecutar "script1":

root@debian6-lts:/tmp/test# ./script1 
Contenido de var1:

Directorio actual:
/tmp/test

Al ejecutar "script2" en una nueva sesión, éste desconoce a la variable "var1" ya que fue definida en otro entorno. Además, los cambios que realiza "script2" no afectan al entorno de "script1".

Modifiquemos "script1" para que ejecute a "script2" en su mismo entorno, es decir, utilizando punto:

root@debian6-lts:/tmp/test# nano script1
root@debian6-lts:/tmp/test# cat script1
#!/bin/bash

var1="¡Hola Mundo!"

. /tmp/test/script2

echo "Directorio actual:"

pwd

Al ejecutar "script1" nuevamente, el comportamiento es diferente al anterior. No sólo "script2" puede acceder a la variable "var1", sino que además se modifica el entorno de "script1" (particularmente la variable $PWD):

root@debian6-lts:/tmp/test# ./script1 
Contenido de var1:
¡Hola Mundo!
Directorio actual:
/

De forma similar, "script1" podría acceder a variables definidas en "script2" (luego de haberlo ejecutado). Sin embargo, el entorno de la sesión actual que invoca a "script1" no se ve afectado, pues se ha ejecutado sin punto (en una nueva sesión):

root@debian6-lts:/tmp/test# pwd
/tmp/test

Tal como lo define el manual de Bash (man bash), punto es un alias del comando builtin de Bash source. Si se cambia . por source en "script1", el comportamiento es exactamente el mismo:

root@debian6-lts:/tmp/test# nano script1
root@debian6-lts:/tmp/test# cat script1 
#!/bin/bash

var1="¡Hola Mundo!"

source /tmp/test/script2

echo "Directorio actual:"

pwd
root@debian6-lts:/tmp/test# ./script1 
Contenido de var1:
¡Hola Mundo!
Directorio actual:
/

Para reforzar el concepto, cuando se ejecuta un script sin punto se está invocando implícitamente a una nueva sesión Bash, independiente de la sesión actual y específica para el mismo. El comportamiento es el mismo que si se ejecuta "script2" invocando a Bash:

root@debian6-lts:/tmp/test# nano script1
root@debian6-lts:/tmp/test# cat script1 
#!/bin/bash

var1="¡Hola Mundo!"

bash /tmp/test/script2

echo "Directorio actual:"

pwd
root@debian6-lts:/tmp/test# ./script1
Contenido de var1:

Directorio actual:
/tmp/test

Adicionalmente, cuando se utiliza punto no es necesario que el script invocado tenga permisos de ejecución, y por otro lado se agrega el directorio actual a la variable $PATH. Punto busca el script primero en el directorio actual, y si no lo encuentra lo busca en los directorios definidos en la variable de entorno $PATH.

Espero que les haya gustado.


Tal vez pueda interesarte


Compartí este artículo