基本関数パラメータ(bash偽信号を手動で生成)

基本関数パラメータ(bash偽信号を手動で生成)

私は特定の状況で特定のパラメータを使用して関数を自動的に呼び出すことができるソリューションを探しています。
以下は具体的なシナリオです。

エラーが発生した場合は、次のようにエラーハンドラを設定できます。

function _trap_err () {
    echo "An error occurred in "$1":"$2" on "$3":"$4".
}

必要なデバッグデータを自動的に収集するようにトラップを設定できます。適切な実行時に

trap '_trap_err "$BASH_SOURCE" "$BASH_LINENO" "$FUNCNAME" "$BASH_COMMAND" ' ERR

AFAIK、これはbashがエラーを検出して信号を送信した場合にのみ機能します。

たとえば、関数引数を確認するときにチェックが失敗したときにエラーを手動で通知するようにこの動作を拡張したいと思います。

# Usage: myfunc <requiredarg>
function myfunc () {
    [[ $# != 1 ]] && emit_err_signal
}

そのエラーを手動で通知する方法がある場合、そのデバッグパラメータは実行中の適切な時点で自動的に収集され、意味のあるデバッグ情報を提供できます。

別のアプローチは、エラーメッセージ(各チェックでハードコードする必要がある)のみを表示し、エラーが発生した場所を表示しないことです。

どんなアイデアがありますか?

編集する
これが私の.bashrcファイル用であることを指定する必要があります。ファイルが終了したくないので、デバッグ情報だけが必要です。これに対する落とし穴は少し過剰かもしれません。次の解決策がうまくいくと思います。

function _debug () {
    local _message=${1:-""}
    printf "\e[1;32m[BASHRC] DEBUG: %-20s - %s\e[0m\n" "$BASH_SOURCE:$BASH_LINENO" "$_message"
}

_debug "Testing debug message."

> [BASHRC] DEBUG: .bashrc.d/bashrc:18  - Testing debug message.

答え1

終了コードを使用できます。

set -e
# Usage: myfunc <requiredarg>
ARGS_NUM_ERROR=50
function myfunc () {
    [[ $# != 1 ]] && exit $ARGS_NUM_ERROR
}

ARGS_NUM_ERRORその後、適切な処理でスクリプトをキャプチャできます。

答え2

ERR終了状態がゼロ以外のすべてのコマンドはトラップをトリガします。これを実行するために明示的なアクションは必要ありません。

function _trap_err () {
  echo "An error occurred in $1:$2 on $3:$4."
}
trap '_trap_err "$BASH_SOURCE" "$BASH_LINENO" "$FUNCNAME" "$BASH_COMMAND" ' ERR

foo () {
    false
}

foo
echo "Some commands that succeed"
foo

関連情報