Получение полной командной строки, вызвавшей ошибку ERR, во время ловушки

Получение полной командной строки, вызвавшей ошибку ERR, во время ловушки

Как заставить ловушку возвращать команду, вызвавшую ошибку ERR?

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

$ trap err_handler ERR

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

Я хотел получить результат вроде

grep caused the error

и возможно (достаточно жадно) иметь всю замененную командную строку. Возможно ли это (без всяких хаков)?

EDIT: Прошу прощения, что не упомянул, что мой панцирь — KSH.

решение1

Убедитесь, что история команд включена (по умолчанию отключена для неинтерактивных оболочек) и используйте ее:

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

trap trapper ERR

# your errors go here

решение2

Если вы используете Bash, вы можете использовать $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.

Несколько замечаний: во-первых, $BASH_COMMANDвыводится только та команда, которая не была выполнена в составных командах, а не вся командная строка.

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

Во-вторых, конвейер терпит неудачу только в случае неудачи последней команды. Он все равно будет успешным, если промежуточные команды терпят неудачу, но последняя команда успешна:

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

Три, $BASH_COMMANDдает вамнеразобранныйкомандная строка, поэтому в необычных обстоятельствах первым в командной строке не обязательно будет имя команды:

$ 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

Связанный контент