Propagando el código de salida a la persona que llama en caso de un error de cáscara del script que tiene una trampa de salida

StackOverflow https://stackoverflow.com//questions/25064292

  •  23-12-2019
  •  | 
  •  

Pregunta

¿Es posible propagar un código de salida a la persona que llama en caso de un error de sintaxis en un script bash con una trampa de salida?Por ejemplo, si tengo:

#! /bin/bash

set -eu

trap "echo dying!!" EXIT

echo yeah
echo $UNBOUND_VARIABLE
echo boo

Luego, ejecutarlo le da un código de salida 0 incluso si el script no terminó realmente correctamente:

$ bash test.sh
yeah
test.sh: line 8: UNBOUND_VARIABLE: unbound variable
dying!!

$ echo $?
0

Pero si comento la trampa de salida, el script devuelve 1. Alternativamente, si reemplazo la línea con la variable no unida con un comando que devuelve el distintero cero (por ejemplo, /bin/false), ese valor de salida se propaga como me gustaría que.

¿Fue útil?

Solución 2

Este comportamiento está relacionado con diferentes versiones de Bash.El guión original funciona como se espera en Bash 4.2 pero no en 3.2.Tener el código propenso a errores en un archivo de script separado y ejecutarlo en una subshell funciona en torno a los problemas en versiones anteriores de Bash:

#!/bin/bash

$BASH sub.sh
RETVAL=$?

if [[ "$RETVAL" != "0" ]]; then
  echo "Dying!! Exit code: $RETVAL"
fi

sub.sh:

set -eu

echo yeah
echo $UNBOUND_VARIABLE
echo boo

Otros consejos

La cáscara sale con el resultado del último comando ejecutado.En su caso de trampa, ese es echo, que generalmente regresa con éxito.

para propagar su valor, simplemente exit con él.

#!/bin/bash

set -eu

die() {
  echo "Dying!!"
  exit "$1"
}

trap 'die $?' EXIT

echo yeah
echo $unbound
echo boo

También tenga en cuenta que set -e se considera dañino: le hace pensar que el script salga si falla un comando, lo que no siempre lo hará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top