strings script not example equal elif linux bash shell sh

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.

Ver http://mywiki.wooledge.org/BashFAQ/105


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.