Como crear una librería de scripts en Bash

Manteniendo todo en su sitio sin volverte loco

Hace relativamente poco tiempo que me peleo con bash y cada vez le cojo más gusto a pesar de los problemas que tengo para manejar adecuadamente y a la primera las cadenas de caracteres, sobre todo al pasarlas como parámetros que a su vez se vuelven a enviar como  parámetro de una función u otro comando. Pero a base de mucho pelear la cosa va saliendo razonablemente.
Y, como soy muy vago, me gusta que mi equipo haga todo aquello que tengo que repetir un montón de veces. Por esta razón he montado este sistema que paso a explicaros.
Supongo que no es la única forma de hacerlo, pero a mi me funciona bastante bien.
  1. Mantengo dos ubicaciones para mis utilidades:
  • ~/bin
  • /usr/local/bin/[el nombre que a mi me apetezca(p.ej.: smbash)]
  • El primero incluido en el PATH de usuario y el segundo incluido en el PATH global hasta el nivel de …/bin
  1. Por otro lado creo dos tipos de archivos:
  1. scripts ejecutables sin extensión
  1. scripts de librería (*.lib) con funciones y variables
  1. El desarrollo lo realizo en: ~/Proyectos/bash/[diversos subdirectorios a mi comodidad]
  1. En este último directorio creo ./Produccion/local/lib y ./Produccion/simo, a donde copio, la primera vez, los archivos que considere de interés y terminados o beta. En ‘./Produccion/local’ los scripts que vayan destinados a ejecución global (‘/usr/local/bin’); En ‘./Produccion/local/lib’ los *.lib de librería destinados a ‘/usr/local/bin/smbash/lib’. Ya que para el mantenimiento actualizado de los scripts por medio de rsync es mas fácil hacerlo sobre un directorio exclusivo, los scripts globales los almaceno en /usr/local/bin/smbash y creo un enlace simbólico desde /usr/local/bin para que estén accesibles. De esta forma si borro un mensaje en origen puedo borrar automáticamente en destino.
Bien, pasemos ya a mostrar los scripts.
El primero es una utilidad que me permite probar un script ejecutable, un programa o una función  en el interior de un fichero de librería. En mi caso en los ficheros ‘*.lib’ dentro de el directorio apuntado por $functionDeafultDir: ‘cmd’. Yo lo tengo en ~/bin.

cmd

#!/bin/bash
# -*- ENCODING: UTF-8 -*-

# fichero:        cmd
# procesador de librerías personales
# Autor:        Simón Martínez [simon[@]cicoss.net]
# Fecha:        08/06/2017
# Sintaxis:        cmd [comando | funcion] [parametros]
# Ejecuta indistintamente un comando o una función de librería
# Útil en depuración

declare functDefaultDir="/usr/local/bin/smbash/lib/*.lib"

declare WD=$(pwd)

if test $1 = "-s"; then
        declare silencio=True
        shift
else
        unset silencio
fi
declare orden="$1"

declare -f prueba

# Comprobamos si la orden pasada como parametro existe
if [[ "$(type "$orden" 2>&1;)" =~ "no se encontró" || "$(type "$1" 2>&1;)" =~ "not found" ]]; then
        # Si no existe buscamos si existe alguna función en algún fichero '.lib' dentro de
        # /usr/local/bin/smbash
        result=("$(grep "function $orden" $functDefaultDir  2>&1;)")
        if [ $? -eq 0 ]; then
                # Si existe el nombre del fichero aparece antes de los dos puntos':'
                # en la respuesta de grep e importamos el fichero