"발신자" 명령은 무엇입니까?

"발신자" 명령은 무엇입니까?

나는 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그런 다음 "호출자"를 검색하십시오).

관련 정보