Obteniendo la línea de comando completa que causó un ERR, mientras que la trampa

Obteniendo la línea de comando completa que causó un ERR, mientras que la trampa

¿Cómo hago una trampa para devolver el comando que provocó un ERR?

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

$ trap err_handler ERR

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

Quería el resultado como

grep caused the error

y posiblemente (lo suficientemente codicioso) para tener toda la línea de comando sustituida. ¿Es posible (sin ningún truco)?

EDITAR: Pido disculpas por no mencionar que mi caparazón es KSH.

Respuesta1

Asegúrese de que el historial de comandos esté habilitado (desactivado de forma predeterminada para shells no interactivos) y utilícelo:

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

trap trapper ERR

# your errors go here

Respuesta2

Si estás usando Bash, puedes usar el $BASH_COMMANDpará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.

Algunas notas: Primero, $BASH_COMMANDle brinda solo el comando que falló en los comandos compuestos, no toda la línea de comando.

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

Segundo, una canalización solo falla si falla el último comando. Aún tiene éxito si los comandos intermedios fallan pero el último comando tiene éxito:

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

Tres, $BASH_COMMANDte da lasin analizarlínea de comando, por lo que lo primero en la línea de comando no es necesariamente el nombre del comando en circunstancias inusuales:

$ 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

información relacionada