Pergunta

Eu gostaria de tentar capturar o sinal 1, mas falhei

#!/bin/bash
# capture an interrupt # 0
trap 'echo "Exit 0 signal detected..."' 0
trap 'echo "Exit 1 signal detected..."' SIGHUP

# display something
echo "This is a checkpoint 1"
exit 1

echo "This is checkpoint 2"
# exit shell script with 0 signal
exit 0

Output--
kithokit@15:02:55 trunk (master) $ ./test.sh 
This is a checkpoint 1
Exit 0 signal detected...
kithokit@15:03:44 trunk (master) $ 

Mesmo que seja a saída 1, sempre fica preso na armadilha 0, alguém sabe como resolver isso?

Obrigado

Foi útil?

Solução

exit 1 não envia um SIGHUP.Ele sai com código de retorno (também conhecido como status de saída) 1.Para enviar um SIGHUP use kill:

#!/bin/bash
# capture an interrupt # 0
trap 'echo "Signal 0 detected..."' 0
trap 'echo "SIGHUP detected..."' SIGHUP

# display something
echo "This is a checkpoint 1"
kill -1 $$

echo "This is checkpoint 2"
# exit shell script with 0 signal
exit 0

$$ é o ID do processo atual.Então, kill -1 $$ envia o sinal 1 (SIGHUP) para o processo atual.A saída do script acima é:

This is a checkpoint 1
SIGHUP detected...
This is checkpoint 2
Signal 0 detected...

Como verificar o código de retorno na saída

Se o objetivo é verificar o código de retorno (também conhecido como status de saída) em vez de capturar sinais especiais, então tudo o que precisamos fazer é verificar a variável de status $? na saída:

#!/bin/bash
# capture an interrupt # 0
trap 'echo "EXIT detected with exit status $?"' EXIT

echo "This is checkpoint 1"
# exit shell script with 0 signal
exit "$1"
echo "This is checkpoint 2"

Quando executado na linha de comando, isso produz:

$ status_catcher 5
This is checkpoint 1
EXIT detected with exit status 5
$ status_catcher 208
This is checkpoint 1
EXIT detected with exit status 208

Observe que a instrução trap pode chamar uma função bash que pode incluir instruções arbitrariamente complicadas para processar diferentes códigos de retorno de maneira diferente.

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