Importar funciones y variables de un fichero externo en Shell Script

Si queremos importar elementos de código de otros ficheros en un script de Bash, como puedan ser los valores de un fichero de configuración o una serie de funciones de una biblioteca, podemos hacerlo con:

. fichero_externo

o con:

source fichero_externo

Vamos a crear un fichero externo al que llamaremos external con  una variable y una función:

string="Hola, mundo"

function greeting(){
    echo "Hola, mundo"
}

Como lo único que hace es almacenar trozos de código, no hace falta darle permisos de ejecución.

Como tampoco es un script le he llamado external sin extensión para que se vea más claro que no es un script.  Aunque lo fuera, tampoco sería necesario añadirle la extensión .sh, pero muchas veces buscamos los scripts con find o instrucciones con grep, así que siempre es mejor, aunque no sea necesario, que seamos limpios a la hora de programar y poner nombre a nuestros ficheros, clases, variables y funciones.

Y ahora vamos a ver las dos opciones antes citadas:

Importar con .

#!/bin/bash

. external

echo $string
greeting

Si ejecutamos nos devolverá:

Hola, mundo
Hola, mundo

Importar con source

#!/bin/bash

source external

echo $string
greeting

Que nos devolverá lo mismo a la hora de ejecutar:

Hola, mundo
Hola, mundo

Posible problema

Hay un posible problema que hay que tener en cuenta, y es que si incluimos cualquier instrucción fuera de una función, al importar el fichero externo, se va a ejecutar. Independientemente de que importemos con . o con source.

En external vamos a añadir una instrucción echo fuera de la función:

string="Hola, mundo"

function greeting(){
    echo "Hola, mundo"
}

echo "Está ejecutándose una instrucción"

Nos devolverá:

Está ejecutándose una instrucción
Hola, mundo
Hola, mundo

Es decir, ejecuta las instrucciones del fichero externo y luego, si hay alguna llamada a una  función o una variable de ese fichero, las lanzará desde el script ejecutable.

Esto es una característica que hay que tener en cuenta si queremos almacenar variables o funciones en ficheros externos. Si no queremos que se ejecute ningún comando desde este fichero, sólo almacenaremos funciones y variables.

Ejecutando fichero externo

También podemos aprovecharnos de esta característica si queremos ahorrarnos alguna tarea farragosa, como escribir </head>
<body>

Podemos tener ficheros con trozos de código que queremos que se ejecute e invocarlos cuando los necesitemos:

Fichero openhtml:

echo "<!DOCTYPE html>"
echo '<html lang="es">'
echo "<head>"

Fichero closehead:

echo "</head>"
echo "<body>"

Fichero closebody:

echo "</body>"
echo "</html>"

Y, en un script lanzar:

#!/bin/bash
. openhtml
echo -e "\n<title>Ahorrando código</title>"
. closehead
echo -e "\n<h1>Estoy usando fichero externos para ahorrar código</h1>"
. closebody

que generaría:

<!DOCTYPE html>
<html lang="es">
<head>
    <title>Ahorrando código</title>
</head>
<body>
    <h1>Estoy usando fichero externos para ahorrar código</h1>
</body>
</html>

Y esto es sólo un ejemplo.

Pero, en general, el mayor uso de . y de source es para importar variables y funciones y así tener más ordenado el código y poder reutilizarlo tantas veces como necesitemos.

 

Un comentario en «Importar funciones y variables de un fichero externo en Shell Script»

Deja una respuesta

Tu dirección de correo electrónico no será publicada.