Estoy estudiando el contenido de este archivo preinst que el script ejecuta antes de que el paquete sea desempaquetado desde su archivo Debian (.deb).
El script tiene el siguiente código:
#!/bin/bash
set -e
# Automatically added by dh_installinit
if [ "$1" = install ]; then
if [ -d /usr/share/MyApplicationName ]; then
echo "MyApplicationName is just installed"
return 1
fi
rm -Rf $HOME/.config/nautilus-actions/nautilus-actions.conf
rm -Rf $HOME/.local/share/file-manager/actions/*
fi
# End automatically added section
Mi primera consulta es sobre la línea:
set -e
Creo que el resto del script es bastante sencillo: Comprueba si el gestor de paquetes de Debian/Ubuntu está ejecutando una operación de instalación. Si lo está, comprueba si mi aplicación acaba de ser instalada en el sistema. Si lo ha hecho, el script imprime el mensaje "MyApplicationName is just installed" y termina (return 1
significa que termina con un "error", ¿no?).
Si el usuario está pidiendo al sistema de paquetes de Debian/Ubuntu que instale mi paquete, el script también borra dos directorios.
¿Es esto correcto o me estoy perdiendo algo?
De help set
:
-e Exit immediately if a command exits with a non-zero status.
Pero se considera una mala práctica por algunos (bash FAQ y irc freenode #bash FAQ autores). Se recomienda su uso:
trap 'do_something' ERR
para ejecutar la función do_something
cuando se producen errores.
set -e
detiene la ejecución de un script si un comando o tubería tiene un error - lo cual es lo contrario del comportamiento por defecto del shell, que es ignorar los errores en los scripts. Escriba help set
en un terminal para ver la documentación de este comando incorporado.
Según el manual bash - The Set Builtin, si -e
/errexit
está configurado, el shell sale inmediatamente si un pipeline consistente en un único comando simple, una lista o un comando compuesto devuelve un estado distinto de cero.
Por defecto, el estado de salida de un pipeline es el estado de salida del último comando en el pipeline, a menos que la opción pipefail
esté activada (está desactivada por defecto).
Si es así, el estado de salida de la tubería es el del último comando (más a la derecha) que sale con un estado distinto de cero, o cero si todos los comandos salen con éxito.
Si desea ejecutar algo a la salida, intente definir trap
, por ejemplo:
trap onexit EXIT
donde onexit
es tu función para hacer algo a la salida, como la de abajo que está imprimiendo el simple stack trace:
onexit(){ while caller $((n++)); do :; done; }
Hay una opción similar -E
/errtrace
que atraparía en ERR en su lugar, por ejemplo
trap onerr ERR
Ejemplo de estado cero:
$ true; echo $?
0
Ejemplo de estado no nulo:
$ false; echo $?
1
Ejemplos de estados negados:
$ ! false; echo $?
0
$ false || true; echo $?
0
Prueba con pipefail
desactivado:
$ bash -c 'set +o pipefail -e; true | true | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; false | false | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; true | true | false; echo success'; echo $?
1
Prueba con pipefail
habilitado:
$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1