3 Power Tips + 1 Power Link I2
En esta edición: 3 poderosos consejos para bash, advirtiéndo sobre la letra chica de ellas y una noticia importante sobre certificados SSL/TLS.
Power Tip #1
Agregar de manera inteligente y selectiva la opción pipefail en bash con set -o pipefail
a los scripts de bash.
De esta manera, bastará con que un solo comando tenga un estado de salida distinto de 0
para que el resultado final también de distinto de 0
. Hay muchas publicaciones e incluso GPTs que aconsejan el uso de pipefail
.
Esto puede ser valioso cuando cualquier comando unido por |
tiene que terminar sin errores para que tenga sentido continuar con la ejecución del script.
Sin embargo, acá van algunas recomendaciones:
-
Evitar
set -o pipefail
globalmente al usar comandos como:grep -q
head
awk 'exit'
sed 'q'
-
Activar
pipefail
solo donde realmente sea necesaria:
(set -o pipefail; comando1 | comando2)
- O desactivar luego de usarla:
set -o pipefail comando1 | comando2 set +o pipefail
Power Tip #2
Realizá tus propios tests para decidir si un script tiene que terminar al ocurrir un error
Se puede leer en el Debian Policy Manual que recomienda fuertemente el uso set -e
. Esa opción le dice a bash que cuando un comando termina en un estado de salida de distinto de 0
el script debe termina inmediatamente. La cuestión es que esa opción tiene muchas de excepciones (algo que se puede verificar al leer la manpage de bash), lo cual hace el uso de esta configuración poco confiable en scripts de gran complejidad.
Tenemos que comprender que bash sabe poco de la semántica. Por ejemplo, considerar este sencillo script:
#! /bin/bash set -e cd /home/admin/download curl -O https://example.com/project.zip unzip project.zip
El comando curl no tiene exit status distinto de 0 si obtiene http code 404, bash no sabe como cada herramienta externa maneja el exit status. Si el archivo projec.zip ya existe, el comando unzip estará operando sobre el la versión del archivo que probablemente no queremos.
Lo correcto que nosotros mismos le agreguemos la lógica necesaria de acuerdo a lo que estamos necesitando.
Probablemente alguien puede estar tentado a agregarle la opción -f
sin embargo la propia manpage de curl
dice que no es 100% segura. Además puede haber casos en los que necesitamos saber exactamente el tipo de problema que hubo. En tal caso lo mejor será obtener el http code con curl y evaluar dicho código con bash, es decir hacemos que cada herramienta haga lo mejor que sabe hacer.
Power Tip #3
Usar set -u
para forzar a que el script termine con error si hay hay variables no definidas. En general, esta opción tiene menos tiene contraindicaciones que las dos anteriores. Es altamente conveniente combinarla con la herramienta shellcheck
. Por ejemplo, en el siguiente script:
#!/bin/bash set -u [[ "$DEBUG" == "yes" ]] && echo "Modo debug" echo "$somevar" someanothervar="example"
- No tiene definida la variable
DEBUG
- No tiene definida la variable
somevar
- La variable
someanothervar
si bien está definida no se usa nunca. No es un error grave, pero al no utilizarse probablemente sea inncesaria, pero es algo que no es detectado porset -u
.
Power Link
¿Certifcados SSL/TLS para direcciones IP?: We've Issued Our First IP Address Certificate
Comentarios
Comments powered by Disqus