bash: 트랩 함수의 함수 호출 스택에 액세스

bash: 트랩 함수의 함수 호출 스택에 액세스

Bash 함수 호출 스택 추적을 처리하는 중...

스크립트는 오류를 포착하고 callStack()함수를 실행합니다. 하지만 캡처할 때 항상 callStack()캡처가 발생한 함수가 아닌 함수 자체의 호출 스택을 표시합니다 .

/share/sbin/zimdialog: line 647: status: command not found
    Function call stack ( command.function() ) ...
      /share/sbin/zimdialog.main()
        /share/sbin/include.callStack()

errantFunction()이와 같은 스택 추적을 갖고 싶습니다 ...

/share/sbin/zimdialog: line 647: status: command not found
    Function call stack ( command.function() ) ...
      /share/sbin/zimdialog.main()
        /share/sbin/zimdialog.errantFunction()
          /share/sbin/include.callStack()

트랩은 다음과 같이 코딩됩니다.

trap callStack HUP INT QUIT TERM ERR

함수 callStack()는 다음과 같이 코딩됩니다.

function callStack () {
  { isNotNull "$1" && isHelp "$1"; } && {
    helpShow 'callStack
    Diagnostics regarding where the call to this function came from'
    return
  }
  local T="${T}  "
  local STACK=
  i=${#FUNCNAME[@]}
  ((--i))
  printf "${T}Function call stack ( command.function() ) ...\n" >&2
  T="${T}  "
  while (( $i >= 0 ))
  do
    STACK+="${T}${BASH_SOURCE[$i]}.${FUNCNAME[$i]}()\n"
    T="${T}  "
    ((--i))
  done
  printf "$STACK" >&2
}

추가됨: set -E 등이 작동하지 않습니다.

존재하다 /share/sbin/gshlib...

set -e
set -E
set -T
shopt -s extdebug

trap $(callStack) ERR

function initialize () {
    :
  logstatus                         #<<< ERROR FOR TESTING trap
}
export -f initialize

Spring 이라는 이름이 잘못되어 logStatus내가 얻은 최고는 ... logstatus/share/sbin/gshlib.initialize()trap ERR

    Function call stack ...
    | /share/sbin/archive.main()
    |   /share/sbin/include.include()
    |     /share/sbin/gshlib.source()
    |       /share/sbin/include.callStack()
/share/sbin/gshlib: line 109: logstatus: command not found

내가 얻고 싶은 것은...

    Function call stack ...
    | /share/sbin/archive.main()
    |   /share/sbin/include.include()
    |     /share/sbin/gshlib.source()
    |       /share/sbin/gshlib.initialize()
    |         /share/sbin/include.callStack()
/share/sbin/gshlib: line 109: logstatus: command not found

답변1

호출된 함수가 상속 되려면 set -E(또는 ) 이 필요합니다 .set -o errtracetrap ERR

이렇게 하면 호출 스택의 모든 함수가 스크립트 오류(0이 아닌 종료 코드 사용)로 인해 종료되기 때문에 계단식 오류 보고서를 받을 수 있습니다.

ERR실패가 치명적이지 않은 것으로 간주되는 상황(예: if또는 while)에서는 쉘 함수를 호출해도 실패가 트리거되지 않습니다. 이러한 상황에서는 스택 추적이 나타나지 않을 수 있지만 버전에 따라 어떻게 다른지는 잘 모르겠습니다.

관련 정보