地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

bashのtarpで疑似シグナルを扱うハンドラ

bashでシグナルハンドラを行い際に便利なコマンドtrapだがSIG*以外にも擬似シグナルをハンドリングすることが可能らしい。

If a sigspec is ERR, the command arg is executed whenever a simple command has a non-zero exit status, subject to the following conditions.
The ERR trap is not executed if the failed command is part of the command list immediately following a while or until keyword, part of the test
in an if statement, part of a command executed in a && or ?? list, or if the command's return value is being inverted via !.
These are the same conditions obeyed by the errexit option.

終了ステータスが0以外やsoruceコマンドの戻り値なんかも対象になる。

疑似シグナル タイミング
EXIT シェルがスクリプトを終了した
ERR コマンド、シェル関数から0ではない終了ステータスが返された
DEBUG シェルが文を実行した
RETURN source または . で実行されたシェル関数/スクリプトが終了した

DEBUGは以下のようなスクリプトがあるとして1行実行されるたびにtrapした内容を出力してくれる仕組み。(シェルをステップ実行したいケースなんかで有効)

#!/bin/bash

# シグナルハンドラを設定
trap 'read -p "next(LINE:$LINENO)>> $BASH_COMMAND"' DEBUG

DEGUB_VAR=10
expr 1 + 1