linux - script - not equals string bash
¿Qué significa set-e en un script de bash? (4)
Estoy estudiando el contenido de este archivo preinst que el script ejecuta antes de que el paquete se descomprima de su archivo de 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 simple: verifica si el administrador de paquetes Debian / Ubuntu está ejecutando una operación de instalación. Si es así, comprueba si mi aplicación se acaba de instalar en el sistema. Si es así, la secuencia de comandos imprime el mensaje "MyApplicationName se acaba de instalar" y finaliza ( return 1
significa que termina con un "error", ¿no?).
Si el usuario le pide al sistema de paquetes Debian / Ubuntu que instale mi paquete, la secuencia de comandos también elimina 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 algunas personas lo consideran una mala práctica (bash FAQ y, por ejemplo, personas que escriben esta FAQ en irc freenode #bash), mejor uso:
trap ''do_something'' ERR
para ejecutar la función do_something
cuando ocurren errores.
De acuerdo con bash: el manual Set Builtin , si se establece -e
/ errexit
, el shell se cierra inmediatamente si un pipeline consiste en un solo comando simple , una lista o un comando compuesto devuelve un estado distinto de cero.
De forma predeterminada, el estado de salida de una tubería es el estado de salida del último comando en la tubería, a menos que la opción pipefail
esté habilitada (está deshabilitada de forma predeterminada).
Si es así, el estado de retorno de la canalización del último comando (extremo derecho) para salir con un estado distinto de cero, o cero si todos los comandos salen correctamente.
Si desea ejecutar algo al salir, intente definir la trap
, por ejemplo:
trap onexit EXIT
donde onexit
es su función para hacer algo al salir, como a continuación, que está imprimiendo el seguimiento de pila simple:
onexit(){ while caller $((n++)); do :; done; }
Hay una opción similar -E/errtrace que podría interceptar ERR en su lugar, por ejemplo:
trap onerr ERR
Ejemplos
Ejemplo de estado cero:
$ true; echo $?
0
Ejemplo de estado distinto de cero:
$ false; echo $?
1
Negando ejemplos de estado:
$ ! false; echo $?
0
$ false || true; echo $?
0
Prueba con pipefail
deshabilitado:
$ 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
Encontré esta pregunta mientras buscaba en Google, tratando de averiguar cuál era el estado de salida de un script que fue abortado debido a un set -e
. La respuesta no me pareció obvia; De ahí esta respuesta. Básicamente, set -e
aborta la ejecución de un comando (por ejemplo, un script de shell) y devuelve el código de estado de salida del comando que falló (es decir, el script interno, no el script externo) .
Por ejemplo, supongamos que tengo un script shell outer-test.sh
:
#!/bin/sh
set -e
./inner-test.sh
exit 62;
El código para inner-test.sh
es:
#!/bin/sh
exit 26;
Cuando ejecuto outer-script.sh
desde la línea de comandos, mi script externo termina con el código de salida del script interno:
$ ./outer-test.sh
$ echo $?
26
set -e
detiene la ejecución de un script si un comando o canalización tiene un error, que es lo opuesto al comportamiento de shell predeterminado, que es ignorar los errores en los scripts. Escriba help set
en un terminal para ver la documentación de este comando incorporado.