Bash debug/failure

Cuando realizo scripts en Bash que son bastante complicados y deseo ver muy bien lo que estan haciendo, suelo crear una funciona llamada debug tal que:

debug () {
    if [ ${DEBUG} -eq 0 ]; then
        echo "[DEBUG] ${1}" 
        return 0
    else
        eval "${1}" > /dev/null 2>&1
        return $?
    fi
}

Por lo que en lugar de hacer las llamadas directamente, se utiliza esto:

debug "mv ${old} ${new}"

Si ejecutamos el script con la variable DEBUG=0 entonces, en lugar de ejecutar el comando, aparecerá el mensaje de debug con el comando. El mayor problema de esto y que se tiene que tener muy en cuenta, es que con esta función tambien podemos incluir comentarios como:

debug "Vamos a mover el directorio"

Estos comentarios no nos traen problemas ya que eval intentará ejecutar Vamos como si fuera un comando y fallaría sin problemas, pero cuidado con estos comentarios.

Otra función que está en mi "Toolbox" es failure:

failure () {
    if [ ${1} -ne 0 ]; then
        echo "[FAIL] (${1}): ${2}"
        exit ${1}
    fi
}

La utilizamos después de ejecutar cualquier comando:

failure $? "Failed to mkdir ${archive_dir}${2}"

La función recibe el código de salida del comando anterior y muestra el mensaje que deseamos en caso de haber fallado. En caso de fallar, devuelve el código de error del comando como el código de error de nuestro script. Tambien podemos utilizarla para resolver algún otro test:

if [ -z "${1}" ] ; then
     failure 1 "No existe el directorio ${1}"
fi


Las dos funciones pueden ser utilizadas en conjunto:

debug "mkdir ${archive_dir}${2}"
failure $? "Failed to mkdir ${archive_dir}${2}"

Además, las ventajas de estas dos funciones es que podemos escribir en un log sin modificar todas nuestras lineas, podemos añadir colores y modificar el formato de salida en un solo lugar y funcionan bastante bien.