私の目標は、各カスタム関数を実行する前に何かをすることです。私の考えの最も簡単な方法は、トラップを使用して信号をデバッグすることです。
パイロットスクリプトは正常に実行されます。
#! /bin/env bash
function welcome { echo "Welcome :)"; }
trap 'declare -F ${BASH_COMMAND%% *} >/dev/null && \
echo "[Running] ${BASH_COMMAND%% *}"' DEBUG
welcome
## will output:
# [Running] welcome
# Welcome :)
すべてのカスタム関数をキャプチャしたいので、「functrace」オプションをオンにする必要があります。しかし、「functrace」がオンの場合、トラップは2回実行されるようです。たとえば、
#! /bin/env bash
set -o functrace
function welcome { echo "Welcome :)"; }
trap 'declare -F ${BASH_COMMAND%% *} >/dev/null && \
echo "[Running] ${BASH_COMMAND%% *}"' DEBUG
welcome
## will output:
# [Running] welcome
# [Running] welcome
# Welcome :)
それでは、私のスクリプトやbashに問題があるのでしょうか?この2つの呼びかけをどのように区別するのですか?
ベストアンサー1
私もこの問題に直面しました。何が起こっているのか正確に言うのは難しいですが、呼び出された関数のコンテキストで2番目の呼び出しがトリガーされるように見えるので、次のようにすることができます。
! /bin/env bash
set -o functrace
function welcome { echo "Welcome :)"; }
function __debug_trap {
declare -F ${BASH_COMMAND%% *} >/dev/null
# funcname[0] is __debug_trap; funcname[1] is the next function on stack
if ! [[ "${BASH_COMMAND%% *}" == "${FUNCNAME[1]}" ]]; then
echo "[Running] ${BASH_COMMAND%% *}"
fi
}
trap __debug_trap DEBUG
welcome
echo not in function
#bash test.sh
#[Running] welcome
#[Running] echo
#Welcome :)
#[Running] echo
#not in function
残りの主な問題は、これは直接再帰呼び出しを誤って抑制しますが、これはbashでは一般的ではありません。