Armadilha, ERR e ecoando a linha de erro

21

Estou tentando criar um relatório de erros usando um trap para chamar uma função em todos os erros:

Trap "_func" ERR

É possível saber de que linha o sinal ERR foi enviado? O shell é bash.

Se eu fizer isso, eu posso ler e relatar qual comando foi usado e registrar / executar algumas ações.

Ou talvez eu esteja com tudo errado?

Eu testei com o seguinte:

#!/bin/bash
trap "ECHO $LINENO" ERR

echo hello | grep "asdf"

E $LINENO está retornando 2. Não está funcionando.

    
por Mechaflash 29.05.2012 / 20:23

2 respostas

46

Como apontado nos comentários, sua citação está errada. Você precisa de aspas simples para impedir que $LINENO seja expandido quando a linha de trapping for analisada pela primeira vez.

Isso funciona:

#! /bin/bash

err_report() {
    echo "Error on line $1"
}

trap 'err_report $LINENO' ERR

echo hello | grep foo  # This is line number 9

Executando:

 $ ./test.sh
 Error on line 9
    
por 06.11.2015 / 16:38
9

Você também pode usar o 'caller' do bash builtin:

#!/bin/bash

err_report() {
  echo "errexit on line $(caller)" >&2
}

trap err_report ERR

echo hello | grep foo

também imprime o nome do arquivo:

$ ./test.sh
errexit on line 9 ./test.sh
    
por 04.07.2017 / 11:34