Tips y trucos

Comando Source: evitando la creación de subprocesos en Bash

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.

Pablo Baenas

View Comments

  • Excelente explicación!
    ¿Esa variable queda al resetear el equipo?

    • No, solo dura mientras la sesión inicial del shell está abierta

    • 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.

Recent Posts

Cómo crear un sistema de popups en Magento 2: Simple Popup Widget

Cómo crear popups personalizados en Magento 2 con widgets. Guía paso a paso. SimplePopupWidget para…

3 años ago

Entorno de desarrollo Magento 2 con Docker en menos de 10 minutos

Configura tu entorno de desarrollo de Magento 2 con Docker en menos de 10 minutos.

3 años ago

Ajustar en Centos la zona horaria (time zone)

Tips para sysadmins: ¿Cómo configuro en Centos la zona horaria? ¿Por qué es importante configurar…

5 años ago

Asignar o cambiar el hostname en Centos 7

Tip para sysadmins: ¿Qué es el hostname de un equipo? ¿Qué tipos de hostname hay?…

5 años ago

Cheat Sheet MySQL: privilegios de usuario

Cuando creamos una base de datos MySQL es una buena medida de seguridad crear diferentes…

11 años ago