Opciones de ejecución del intérprete Bash
Control de salida / error de comandos
Constantes de ámbito global: En mayúsculas y con prefijo K_
Tras la asignación de su varlor se definen readonly
Cualquier intento de modificación posterior provocará un error.
Variables de ámbito global: En mayúsculas y con prefijo que habitual-
mente debería indicar dónde se han definido.
Esta variable ha sido definida en el include inc_cfg.sh
Variables de ámbito global que sólo deben ser empleadas en el archivo
que las define: En mayúsculas, precedidas de doble guión bajo (__) y un
prefijo que indica habitualmente el archivo donde se definen.
Variables locales: En minúsculas.
Funciones: En minúsculas precedidas de un guión bajo y con un prefijo
que habitualmente indica el archivo donde se definen.
El sistema de archivos de los script,s tiene tres directorios principales, que
se definen en el propio archivo del script.
K_CFG_SCRIPTS_PATH_SYSTEM: directorio donde se almacena información común
a todos los script,s, tal como:
/include: directorio donde se almacenan los includes que pueden ser
llamados mediante source.
/files/files_exclude: directorio que almacena lo archivos exclude que
serán usado en los script,s (rsync)
/files/files_pass: directorio que alamacena los archivos con las con-
traseñas que pueden usar los scritp,s para acceder a servicios.
K_CFG_SCRIPTS_PATH_CONFIG: El directorio donde se alamacena la información
específica del scritp. En directorio se guarda el archivo ini del script,
el directorio temporal, los archivos de log, ...
K_CFG_SCRIPTS_PATH_SOURCE: directorio donde se encuentran los archiovs a
incluir con source. Si no se define manualmente, por defecto será:
K_CFG_SCRIPTS_PATH_SOURCE="$K_CFG_SCRIPTS_PATH_SYSTEM/include
En el inicio del script se define el directorio que debe ser asignado a cada uno
de ellos. Esto puede hacerse de dos formas:
Leyendo la información desde variables de entorno definidas en ~/.envms
Asigando su valor en el scritp.
Por defecto, se espera que en ~/.envms se encuentren definidas las variables de
entorno necesarias para inicializar el valor de los dos primeros:
~/envms:
# Path donde los scripts almacenan su configuración/información
export SCRIPTS_PATH_CONFIG=$HOME/.config/myscripts
# Path donde se encuentra el sistema de archivos de los scripts
export K_CFG_SCRIPTS_PATH_SYSTEM=$HOME/script_juanp
El script asignará estos valores a las constantes indicadas anteriormente, com-
probando que los directorios existan y sean accesibles. Esto lo realiza en:
# Carga las variables de entrono si no lo hubieran sido ya.
if [[ -z "${LOADED_ENV+x}" ]]; then
# shellcheck disable=SC1091
source "$HOME/.envms"
fi
También se puede asignar un valor manualmente, para ello comentar las líneas an-
teriores y asignar el valor deseado a la(s) constantes. Una vez tengan un valor,
el proceso de asignación del valor no se realizará.
if [[ -z "${K_CFG_SCRIPTS_PATH_CONFIG+x}" ]]; then
Definidos en el archivo include inc_cfg.sh se encuentran:
K_CFG_DIR_SCRITP: directorio donde se almacenará la información específica
del script.
Siendo el nombre del script task_backup.sh:
K_CFG_DIR_SCRITP="$K_CFG_SCRIPTS_PATH_SYSTEM/task_backup"
K_CFG_TMP_DIR_SCRIPT: directorio donde el script almacenará todos los ar-
chivos temporales.
Se define en base a K_CFG_DIR_SCRITP:
K_CFG_TMP_SCRITP="$K_CFG_DIR_SCRITP/tmp"
Los script y librerias se ejecutan con las siguientes opciones de ejecución:
set -eEuo pipefail
Descripción de cada una de ellas:
e: Hace que el script termine inmediatamente si un comando falla (devuelve
código distinto de 0).
E: Hace que los trap de ERR se hereden en funciones y subshells.
u: Hace que el script falle si usas una variable no definida.
o pipefail: El pipeline falla si cualquiera de los comandos falla.
Tiene por objeto definir las variables globales necesarias para el funciona-
miento del script. Será el primero en incluirse (source) en el script.
Además de los directorios indicados anteriormente, en este archivo se defi-
ne:
__CFG_NAME_ONLY_SCRITP:
K_CFG_DATE_INI_SCRIPT:
K_CFG_NAME_INI_SCRIPT:
K_CFG_NAME_FILE_LOG:
Colores:
CFG_COLOR_RED
CFG_COLOR_YELLOW
CFG_COLOR_GREEN
CFG_COLOR_END
:
:
:
:
:
En la ejecución de comandos con las opciones de ejecución, cualquier error pro-
voca la finalización del scritp. No obstante, ha determinadas ocasiones en las
que no se desea ese comportamiento.
Ejemplo 1: Emplear una función que devuelve True / False (error). En este ca-
caso no deseamos que se rompa el script al ejecutar la función y
esta devuelva error, sino controlarlo y, por ejemplo, mostrar un
mensaje.
_check_is_valid(){
if [[ $1 -eq 0]]; then
return 1
else
return 0
fi
if ! _check_is_valid 1; then
echo "Error: No es válido ..."
fi
Ejemplo 2: Un comando más complejo que no queremos que en caso de error finali-
ce sin más el script.
# --- Se ejecuta con "tolerancia a error"
set +e # Desactivar temporalmente e
set +o pipefail
rsync "${opts[@]}" \
"$ORIGEN" "$DESTINO" \
2> "$FILE_LOG_ERROR" | _log_add
rc=${PIPESTATUS[0]}
set -e # Activar
set -o pipefail
# --- Contorl de errores
if [[ $rc -gt 0 ]]; then
_log_add "ERROR: El comando rsync ha finalizado con el código de error $rc"
while IFS= read -r linea; do
[[ -n "$linea" ]] && _log_add "ERROR: $linea"
done < "$FILE_LOG_ERROR"
return 1
fi