A propagação de código de saída para o chamador no caso de uma concha de erro de script de ter uma saída armadilha

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

  •  23-12-2019
  •  | 
  •  

Pergunta

É possível propagar-se um código de saída para o chamador no caso de um erro de sintaxe no script Bash com uma SAÍDA armadilha?Por exemplo, se eu tenho:

#! /bin/bash

set -eu

trap "echo dying!!" EXIT

echo yeah
echo $UNBOUND_VARIABLE
echo boo

Em seguida, executando dá um código de saída 0, mesmo se o script realmente não terminar com êxito:

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

$ echo $?
0

Mas se eu comentar a sair da armadilha, o script retorna 1.Em alternativa, se eu substituir a linha com a variável independente com um comando que retorna diferente de zero (por exemplo, /bin/false), que o valor de saída é propagada como eu gostaria.

Foi útil?

Solução 2

Este comportamento está relacionado com diferentes Bash versões.O script original funciona como esperado no Bash 4.2, mas não 3.2.Tendo o sujeito a erros de código em um arquivo de script separado e executando-a em um sub-shell funciona em torno de problemas anteriores Bash versões:

#!/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

Outras dicas

O shell termina com o resultado do último comando executado.Em sua armadilha caso, que echo, que geralmente retorna com sucesso.

Para propagar o seu valor, basta exit com ele.

#!/bin/bash

set -eu

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

trap 'die $?' EXIT

echo yeah
echo $unbound
echo boo

Observe também que set -e é considerado prejudicial -- faz você pensar que o script vai sair se um comando falhar, o que não é sempre que fazer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top