Cuando se ejecuta desde una shell un comando o un script, se crea un subproceso (proceso hijo) de la shell que ejecuta el comando o el script (proceso padre).
Si el script que ejecuta el proceso hijo crea o modifica alguna variable de entorno, esos cambios o variables desaparecen cuando finaliza el comando o script.
Si deseamos que dichos cambios permanezcan, podemos utilizar el comando de Bash source. Este comando hace que el proceso o comando se ejecute sin crear ningún proceso hijo, de forma que los cambios efectuados en las variables de entorno y demás, se mantengan al finalizar el archivo.
Veamos el uso del comando source de Bash con un ejemplo.
Tenemos creado el script ejemplo_source.sh, que contiene el siguiente código
#!/bin/bash
VAR_EJEMPLO_SOURCE='www.aradaen.com';
echo '$VAR_EJEMPLO_SOURCE='$VAR_EJEMPLO_SOURCE;
Este script asigna a la variable VAR_EJEMPLO_SOURCE el valor ‘www.aradaen.com’ y muestra su valor en pantalla.
En este ejemplo vamos a mostrar el valor de la variable VAR_EJEMPLO_SOURCE antes y después de la ejecución del script de forma estándar:
[usr@srv]: echo $VAR_EJEMPLO_SOURCE
[usr@srv]: ejemplo_source.sh
$VAR_EJEMPLO_SOURCE=www.aradaen.com
[usr@srv]: echo $VAR_EJEMPLO_SOURCE
[usr@srv]:
Como vemos en el ejemplo anterior, la variable VAR_EJEMPLO_SOURCE, no existe previamente de forma que no tiene ningún valor asignado.
[usr@srv]: echo $VAR_EJEMPLO_SOURCE
...
Al ejecutar de forma estándar el script ejemplo_source.sh, se le asigna el valor a la variable, y muestra su valor.
...
[usr@srv]: ejemplo_source.sh
$VAR_EJEMPLO_SOURCE=www.aradaen.com
...
Pero al finalizar el programa, los cambios que realiza desaparecen con el: VAR_EJEMPLO_SOURCE al finalizar la ejecución del script, sigue sin tener valor asignado
...
[usr@srv]: echo $VAR_EJEMPLO_SOURCE
[usr@srv]:
Vamos a efectuar ahora el mismo proceso, pero utilizando el comando source para ejecutar el script ejemplo_source.sh:
[usr@srv]: echo $VAR_EJEMPLO_SOURCE
[usr@srv]: source ejemplo_source.sh
$VAR_EJEMPLO_SOURCE=www.aradaen.com
[usr@srv]: echo $VAR_EJEMPLO_SOURCE
www.aradaen.com
[usr@srv]:
Inicialmente la variable $VAR_EJEMPLO_SOURCE no tiene valor.
[usr@srv]: echo $VAR_EJEMPLO_SOURCE
...
Al ejecutar el script utilizando el comando source, se asigna el valor a la variable y se muestra en pantalla
...
[usr@srv]: source ejemplo_source.sh
$VAR_EJEMPLO_SOURCE=www.aradaen.com
...
Pero a diferencia del ejemplo anterior, ahora, al finalizar la ejecución del script, la variable mantiene $VAR_EJEMPLO_SOURCE mantiene el valor asignado en el script:
...
[usr@srv]: echo $VAR_EJEMPLO_SOURCE
www.aradaen.com
[usr@srv]:
Como vemos, al ejecutar el script utilizando el comando source es ejecutado directamente por el mismo proceso y no con un subproceso, por lo que los cambios en variables se mantienen.
Excelente explicación!
¿Esa variable queda al resetear el equipo?
No, solo dura mientras la sesión inicial del shell está abierta
[…] https://www.aradaen.com/tips-y-trucos/comando-source-evitando-la-creacion-de-subprocesos-en-bash/ […]
Gracias por tu post, me sirvió de muchisimo.
mucha redundancia para explicar algo
Hola Agustín, tomo nota, aunque ten en cuenta que intento explicarlo sin conocer a priori el nivel de conocimientos que tiene el lector, por eso lo explico detalladamente con ejemplos, cosa que para alguien experimentado puede ser innecesario.
Yo te agradezco mucho la explicación que nos has dado. No todos somos tan genios como Agustín Tampon jajajajaj
Muy buen aporte Pablo Baenas!!!
…no falta el inconforme. Una pregunta Agustín Tambo: ¿Ya estás en la NASA? PPPPFFFFFF!!!!