Pula a saída 'natural' na armadilha

2

Meu script parece:

trap "$(pwd)/dd-destroy.sh $l-env;$(pwd)/dd-drop.sh $l-db;exit" INT QUIT TERM EXIT

./dd-all.sh $l $l-db $l-env || exit 1

app_ip=$(./dd-status.sh ip $l-env|grep docker-app|awk '{print $3}')
url=http://$app_ip:8080/app/

wget -O /dev/null $url || (echo "access $url failed" && false) || exit 1

Agora eu quero este lançamento de armadilha quando ocorre erro, aqueles 'exit 1' (eu posso mudá-los lá). Mas quando nada acontece, como o dd-all.sh funcionou bem, quando o wget veio bem. Eu não quero chamar por destruir.

Posso fazer isso com armadilha? Não é meu roteiro, preciso mudar um pouco. Talvez a armadilha seja uma má escolha aqui?

    
por Sarseth 01.10.2015 / 16:25

1 resposta

3

Basta alterar o início do seu trap para verificar o código de retorno do último comando (que será o da saída, ou o comando em o fim do script) para zero. Ou seja

trap '[ $? = 0 ] && exit;'"..."

onde "..." é sua string atual, que deve ser seguida sem espaços intermediários. Uma saída dentro da armadilha não será capturada novamente.

Se a sua armadilha também estiver lidando com sinais, por exemplo, SIGINT (controle-C), então a armadilha é chamada uma vez para o SIGINT, então mais uma vez para a saída. Provavelmente, você pode verificar se o trap está sendo chamado de SIGINT, pois o $? será 128 + n, onde n é o sinal, portanto, 130 para SIGINT. Lembre-se que $? será alterado assim que você der outro comando, então talvez comece com rc=$?; e use $rc em seus testes.

    
por 01.10.2015 / 19:55

Tags