openbox를 맨 위에서 우분투 10.10으로 실행하고 있습니다. 오늘은이라는 명령을 발견 caller
했지만 매뉴얼 페이지가 없으며 입력 (또는 --help)에 응답하지 않으며 어디서 찾을 수 없습니다.
그게 뭔지 알아?
openbox를 맨 위에서 우분투 10.10으로 실행하고 있습니다. 오늘은이라는 명령을 발견 caller
했지만 매뉴얼 페이지가 없으며 입력 (또는 --help)에 응답하지 않으며 어디서 찾을 수 없습니다.
그게 뭔지 알아?
답변:
운영
type caller
셸이 내장되어 있음을 알 수 있습니다. 달리는
help caller
bash 매뉴얼 페이지에도 기능이 표시됩니다. 간단히
Return the context of the current subroutine call.
help
명령이 있습니다
type type
, type help
, help type
과 help help
: 실행 재미있을 수
는 caller
배쉬 버전 3.0에 출연 (안 POSIX에 의해 지정) 내장 명령이며 활성 서브 루틴 호출의 컨텍스트를 반환합니다. 자세한 내용은 Bash-Builtins 를 참조하십시오 .
통사론:
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 확장 디버깅 기능을 사용할 수 있으며 호출자보다 자세한 정보를 제공하는 여러 가지 특수 매개 변수가 있습니다 (예 :)
BASH_ARG{C,V}
. Bashdb 와 같은 도구 는 Bash의 고급 디버그 기능 중 일부를 사용하도록 지원할 수 있습니다.
출력 형식화 방법을 제어하기 위해 변수로 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