Obtendo a linha de comando completa que causou uma ERR, enquanto armadilha

3

Como eu faço o trap para retornar o comando que causou um ERR?

$function err_handler() { echo "$0 caused the error"; }

$ trap err_handler ERR

$ grep -ci "failed" test4 &>/dev/null
-bash caused the error

Eu queria a saída como

grep caused the error

e possivelmente (suficientemente ganancioso) para ter toda a linha de comando substituída. É possível (sem hacks)?

EDIT: Peço desculpas por não mencionar que minha concha é KSH.

    
por user917279 03.10.2013 / 15:39

2 respostas

4

Certifique-se de que o histórico de comandos esteja ativado (desativado por padrão para shells não interativos) e use-o:

#!/bin/bash
set -o history
function trapper () {
    printf "culprit: "
    history 1
}

trap trapper ERR

# your errors go here
    
por 03.10.2013 / 19:48
2

Se você estiver usando o Bash, use o parâmetro $BASH_COMMAND :

BASH_COMMAND
    The command currently being executed or about to be executed, unless
    the shell is executing a command as the result of a trap, in which case
    it is the command executing at the time of the trap.

Algumas notas: Um, $BASH_COMMAND fornece apenas o comando que falhou nos comandos compostos, não na linha de comando inteira.

$ function err_handler { echo "error: $BASH_COMMAND" }
$ trap err_handler ERR
$ true blah blah blah && false herp derp
error: false herp derp

Dois, um pipeline só falha se o último comando falhar. Ainda é bem-sucedido se os comandos intermediários falharem, mas o último comando for bem-sucedido:

$ echo okay | false herp derp | true lol
# err_handler not called, the last command returned true.

Três, $BASH_COMMAND fornece a linha de comando unparsed , portanto, a primeira coisa na linha de comando não é necessariamente o nome do comando em circunstâncias incomuns:

$ false herp derp                       # This is okay.
error: false herp derp
$ {false,herp,derp}                     # An obfuscated way to write 'false blah blah'
error: {false,herp,derp}
$ cmd=false
$ $cmd herp derp                        
error: $cmd herp derp
    
por 03.10.2013 / 20:21