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.
Pingback: Ejecutar de forma aleatoria una función en Shell Script – Linux en Español