Sysadmin Tips y trucos

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

single image

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. #!/bin/bash
  2.  
  3. VAR_EJEMPLO_SOURCE='www.aradaen.com';
  4.  
  5. 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. [usr@srv]: echo $VAR_EJEMPLO_SOURCE
  2.  
  3. [usr@srv]: ejemplo_source.sh
  4. $VAR_EJEMPLO_SOURCE=www.aradaen.com
  5. [usr@srv]: echo $VAR_EJEMPLO_SOURCE
  6.  
  7. [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. [usr@srv]: echo $VAR_EJEMPLO_SOURCE
  2.  
  3. ...

Al ejecutar de forma estándar el script ejemplo_source.sh, se le asigna el valor a la variable, y muestra su valor.

  1. ...
  2. [usr@srv]: ejemplo_source.sh
  3. $VAR_EJEMPLO_SOURCE=www.aradaen.com
  4. ...

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

  1. ...
  2. [usr@srv]: echo $VAR_EJEMPLO_SOURCE
  3.  
  4. [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.

  1. [usr@srv]: echo $VAR_EJEMPLO_SOURCE
  2.  
  3. ...

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:

  1. ...
  2. [usr@srv]: echo $VAR_EJEMPLO_SOURCE
  3. www.aradaen.com
  4. [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.

6 Comentarios
  1. Sebastián 10 años ago
    Contestar

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

  2. Juan Carlos 3 años ago
    Contestar

    Gracias por tu post, me sirvió de muchisimo.

  3. Agustin Tambo 2 años ago
    Contestar

    mucha redundancia para explicar algo

    • Pablo Baenas 2 años ago
      Contestar

      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.

Escribir comentario

Tu email no será publicado.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Otras noticias de interés