「functrace」がオンの場合、シェル機能が実行される前にデバッグ信号のトラップが2回トリガされます。

「functrace」がオンの場合、シェル機能が実行される前にデバッグ信号のトラップが2回トリガされます。

私の目標は、各カスタム関数を実行する前に何かをすることです。私の考えの最も簡単な方法は、トラップを使用して信号をデバッグすることです。

パイロットスクリプトは正常に実行されます。

#! /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では一般的ではありません。

おすすめ記事