나는 openbox가 실행되는 Ubuntu 10.10을 실행하고 있습니다. 오늘 발견한 것은 이라는 명령이 있지만 caller
매뉴얼 페이지도 없고 어떤 입력(또는 --help)에도 응답하지 않으며 whereis에서 이를 찾을 수 없다는 것입니다.
그것이 무엇인지 아시나요?
답변1
달리기
type caller
내장 쉘임을 알 수 있습니다. 달리기
help caller
해당 기능은 bash 매뉴얼 페이지에 표시되고 보고됩니다. 간단히
Return the context of the current subroutine call.
답변2
Bash 버전 3.0에 도입된 내장 명령(POSIX 미지정) 은 caller
활성 서브루틴 호출의 컨텍스트를 반환합니다. 바라보다:배쉬 내장더 읽어보려면.
통사론:
caller [FRAMENUMBER]
만약에프레임음수가 아닌 정수로 제공되며 현재 실행 호출 스택의 해당 위치에 해당하는 라인 번호, 서브루틴 이름 및 소스 파일을 표시합니다.
매개변수 없이방문객현재 서브루틴 호출의 라인 번호와 소스 파일 이름을 표시합니다.
다음을 확인하세요Bash Hackers Wiki의 간단한 스택 추적:
#!/bin/bash
die() {
local frame=0
while caller $frame; do
((frame++));
done
echo "$*"
exit 1
}
f1() { die "*** an error occured ***"; }
f2() { f1; }
f3() { f2; }
f3
산출:
12 f1 ./callertest.sh
13 f2 ./callertest.sh
14 f3 ./callertest.sh
16 main ./callertest.sh
*** an error occured ***
die
다음은 적당히 복잡한 스크립트에서 오류를 추적하는 좋은 함수의 예입니다 .
{ bash /dev/stdin; } <<<$'f(){ g; }\ng(){ h; }\nh(){ while caller $((n++)); do :; done; }\nf'
보다 복잡한 디버깅의 경우 호출자가 제공할 수 있는 것보다 더 자세한 정보를 제공하는 여러 특수 매개변수(예:
BASH_ARG{C,V}
)와 함께 Bash 확장 디버깅 기능을 사용할 수 있습니다. 다음과 같은 도구배쉬 데이터베이스Bash의 고급 디버깅 기능 중 일부를 사용하는 데 도움이 될 수 있습니다.
답변3
출력 형식을 제어하기 위해 read
출력을 변수에 넣을 수 있습니다 .caller
stacktrace() {
local frame=0 LINE SUB FILE
while read LINE SUB FILE < <(caller "$frame"); do
echo "${SUB} @ ${FILE}:${LINE}"
((frame++))
done
}
데모:
$ cat /tmp/caller.sh
#!/bin/bash
stacktrace() {
local frame=0 LINE SUB FILE
while read LINE SUB FILE < <(caller "$frame"); do
printf ' %s @ %s:%s' "${SUB}" "${FILE}" "${LINE}"
((frame++))
done
}
die() {
echo "$*"
stacktrace
exit 1
}
f1() { die "*** an error occured ***"; }
f2() { f1; }
f3() { f2; }
f3
$ bash /tmp/caller.sh
*** an error occured ***
die @ /tmp/caller.sh:13
f1 @ /tmp/caller.sh:17
f2 @ /tmp/caller.sh:18
f3 @ /tmp/caller.sh:19
main @ /tmp/caller.sh:21
답변4
이것은 스택 추적을 인쇄하는 데 사용할 수 있는 쉘 내장입니다. ( man bash
그런 다음 "호출자"를 검색하십시오).