Como faço para que o trap retorne 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 (ganancioso o suficiente) para ter toda a linha de comando substituída. É possível (sem hacks)?
EDIT: Peço desculpas por não mencionar que meu shell é KSH.
Responder1
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
Responder2
Se estiver usando Bash, você pode usar o $BASH_COMMAND
parâmetro:
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: Uma, $BASH_COMMAND
fornece apenas o comando que falhou em comandos compostos, não a 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
Segundo, um pipeline só falha se o último comando falhar. Ainda será 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
dá a você onão analisadolinha de comando, 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