AraDaen, sysadmin notes Blog sobre administración de sistemas operativos, análisis de nuevas tecnologías, diseño y desarrollo de software a medida (Java, .NET, Android) y otras noticias

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

Tips y trucos

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

1
2
3
4
5
#!/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:

1
2
3
4
5
6
7
[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.

1
2
3
[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.

2
3
4
5
...
[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

3
4
5
6
...
[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:

1
2
3
4
5
6
7
[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.

1
2
3
[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

2
3
4
5
...
[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:

4
5
6
7
...
[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.

3 comments

  1. Sebastián says:

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

Leave a Reply

Your email address will not be published. Required fields are marked *