トラップが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
そしておそらく(十分に欲張って)コマンドライン全体を置き換えるでしょう。 (ハッキングなし)可能ですか?
編集:私のシェルが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