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 errtrace
trap ERR
이렇게 하면 호출 스택의 모든 함수가 스크립트 오류(0이 아닌 종료 코드 사용)로 인해 종료되기 때문에 계단식 오류 보고서를 받을 수 있습니다.
ERR
실패가 치명적이지 않은 것으로 간주되는 상황(예: if
또는 while
)에서는 쉘 함수를 호출해도 실패가 트리거되지 않습니다. 이러한 상황에서는 스택 추적이 나타나지 않을 수 있지만 버전에 따라 어떻게 다른지는 잘 모르겠습니다.