Include en scripts Bash

Linux Nivel Alto 10 de jul. de 2024

¿Includes en Bash?

Seguro que te sorprende, pero en un script bash puedes realizar "includes" como si de un lenguaje de alto nivel se tratase.

Tienes al menos dos formas de realizar la inclusión de código externo a tu script bash:

  • . /ruta/fichero
  • source /ruta/fichero

Que diferencias hay entre usar el punto o usar source

El punto . es la forma estándar de realizar el include y funciona en todas las shell (bash, sh, ksh, zsh, etc), sin embargo source es simplemente un alias para . y puede que algunas ocasiones en la sh no te funcione.

Mi recomendación es usar siempre por compatibilidad el punto .

Uso como Librería de funciones

Vamos a crear dos ficheros funciones.sh y lib-bash, y vamos a escribir en ellos el código que queremos posteriormente incluir en nuestro script:

funciones.sh

function uno() {
    echo "Soy la funcion 'uno' "
}

function dos() {
    echo "Soy la funcion 'dos' "
}

lib-bash

function suma() {
 A=$1
 B=$2
 echo "$A + $B = " $((A+B))
}

Ahora vamos a crear programa.sh con el siguiente contenido:

#!/bin/bash
# Incluimos funciones.sh (mediante . )
. funciones.sh
# Incluimos lib-bash (mediante source)
source lib-bash

# --- Main del Programa ---
echo 
echo "Ejecutando el programa..."
echo

# LLamamos a las funciones: uno y dos
uno
dos

# Usamos la libreria y su funcion suma
suma 5 4

echo
echo "Fin del programa"

Una vez grabado le damos permisos de ejecución: chmod +x programa.sh

A los ficheros que vamos a "incluir" no hace falta que tengan permisos de ejecución, incluso siendo unicamente de sólo lectura funcionarán correctamente.

Ahora sólo nos falta comprobar el funcionamiento de programa.sh:

./programa.sh 

Ejecutando el programa...

Soy la funcion 'uno' 
Soy la funcion 'dos' 
5 + 4 =  9

Fin del programa

Uso como Bloque de Código

En el ejemplo anterior lo hemos usado como si se tratase de librerias de fuciones para nuestro script.

Pero podemos incluso usarlo como bloques de códigoy ejecutarlos en la posición que deseemos dentro de un script.

BloqueCodigo.sh

echo "------------------------------"
echo "Soy un trozo de codigo externo"
echo "------------------------------"

carga.sh

#!/bin/bash

echo "Ejecutando el programa"

# include de codigo
. BloqueCodigo.sh

echo "fin"

Damos permisos de ejecución unicamente al script principal:

chmod +x carga.sh

Y comprobamos su funcionamiento:

./carga.sh 
Ejecutando el programa
------------------------------
Soy un trozo de codigo externo
------------------------------
fin

Ventajas del include en tus scripts

En el caso de que tengas un script complicado de muchas líneas te permite extraer fuera del código principal las funciones, variables o código para que sea más fácil su edición.

Si se trata de un script complejo, puedes repartir la creación, edición y depuración de trozos de código o funciones entre varias personas.

Otra ventaja de dividirlo en trozos y luego realizar los "includes", es que puedes evitar que ciertas partes de código no sea visibles o ejecutables al estar de forma separada, además de evitar errores.

Buenas prácticas al usar "includes"

Para mejorar la visibilidad y localización del código se puede mejorar el estilo de la nomenclatura de las funciones para saber desde que fichero externo es llamado.

Se puede nombrar comenzando por las siglas o nombre del fichero en que se encuentran, un separador y el nombre de la función.

Para ello podemos nombrarlos de diferentes formas, adoptando una nomenclatura que sea conocida por todo el grupo que trabaje con esos scripts.

Ejemplos de nomenclaturas para funciones podemos usar y funcionan correctamente en bash:

  • Opcion 1: function fich::funcion() { ... }
  • Opción 2: function fich:funcion() { ... }
  • Opción 3: function fich@funcion() { ... }
  • Opcion 4: funcion fich_funcion() { ... }

Si por ejemplo decidimos usar la nomenclatura de la opción 1:

Fichero lib.sh

function lib::suma() {
    ...
}
 
lib::resta() {
    ...
}

A la hora de usarlos en el script principal o entre ficheros debermos usar el nombre completo de como hemos llamado al script:

Fichero programa.sh

#!/bin/bash
# "Include" en bash
. lib.sh

lib::suma 3 5

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux