Ejecutar scripts desde un script principal utilizando la misma subshell

En el post anterior aprendimos el concepto de subshells como procesos hijos de la shell. También aprendimos que cuando ejecutamos un script, el mismo corre dentro de una subshell. En esta oportunidad veremos cómo ejecutar scripts individuales desde otro al que denominaremos «principal».

Ejecutar scripts

Cuando un script debe realizar varias tareas complejas, es conveniente separar cada una en scripts separados. De esa manera, es más fácil mantener o modificar cada una de ellas a futuro. También es más simple detectar problemas que si todo el código estuviera contenido en un mismo archivo. Esta es la razón por la que consideramos la posibilidad de abordar el tema que nos ocupa en este post.

Para empezar, vamos a ilustrar este punto con los siguientes archivos: principal.sh, aux1.sh, aux2.sh, y aux3.sh. Desde el primero invocaremos los tres siguientes de la siguiente manera utilizando el comando source o el punto (.). Cabe destacar que ambos métodos son sinónimos:

#!/bin/bash

echo "Este es el script principal y tiene como propósito ejecutar a los tres auxiliares. El PID es $$ y el PPID es $PPID."."

# Ejecutar aux1.sh
source aux1.sh

# Ejecutar aux2.sh
. aux2.sh

# Ejecutar aux3.sh
source aux3.sh

El contenido de los archivos auxiliares es el siguiente:

aux1.sh:

sleep 10
echo "Este es el segundo script auxiliar. El PID es $$ y el PPID es $PPID."

aux2.sh:

sleep 10
echo "Este es el segundo script auxiliar. El PID es $$ y el PPID es $PPID."

aux3.sh:

sleep 10
echo "Este es el tercer script auxiliar. El PID es $$ y el PPID es $PPID."

Es importante notar que los scripts auxiliares que son llamados desde el principal no necesitan tener el shebang #!/bin/bash al principio. Tampoco necesitan tener permisos de ejecución.

Ahora ejecutemos principal.sh y veamos el resultado en la Fig. 1:

Ejecutar scripts auxiliares desde uno principal
Figura 1 – Ejecutar scripts auxiliares desde uno principal

Analizando el script

Si prestamos atención, veremos que el script principal y todos los auxiliares comparten el mismo PID y PPID. ¿A qué se debe esto? Es debido al hecho de que al correr un script mediante source o el punto (.), el mismo se ejecutará en la misma shell, heredando las variables disponibles en el proceso padre. En este caso particular, los scripts auxiliares se ejecutan en la misma subshell que principal.sh.

Espero que este post les haya resultado de utilidad. ¡Nos leemos en breve!