[unix] “발신자”명령은 무엇입니까?

openbox를 맨 위에서 우분투 10.10으로 실행하고 있습니다. 오늘은이라는 명령을 발견 caller했지만 매뉴얼 페이지가 없으며 입력 (또는 –help)에 응답하지 않으며 어디서 찾을 수 없습니다.

그게 뭔지 알아?



답변

운영

type caller

셸이 내장되어 있음을 알 수 있습니다. 달리는

help caller

bash 매뉴얼 페이지에도 기능이 표시됩니다. 간단히

Return the context of the current subroutine call.


답변

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의 고급 디버그 기능 중 일부를 사용하도록 지원할 수 있습니다.


답변

쉘 내장 명령입니다 : man bash( ‘caller’를 검색하십시오)
스택 추적을 인쇄하는 데 사용할 수 있습니다.


답변

출력 형식화 방법을 제어하기 위해 변수로 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


답변