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.
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
Por otro lado creo dos tipos de archivos:
scripts ejecutables sin extensión
scripts de librería(*.lib) con funciones y variables
El desarrollo lo realizo en: ~/Proyectos/bash/[diversos subdirectorios a mi comodidad]
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.
Manteniendo todo en su sitio sin volverte loco
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