¿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_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.
Algunas notas: Primero, $BASH_COMMAND
le 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_COMMAND
te 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