如何使 trap 返回导致 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
并且可能(足够贪婪)拥有整个替换的命令行。有可能吗(没有任何黑客手段)?
编辑:我很抱歉没有提及我的 shell 是 KSH。
答案1
确保命令历史记录已启用(非交互式 shell 默认关闭)并使用:
#!/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