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


12

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

그게 뭔지 알아?

답변:


16

운영

type caller

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

help caller

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

Return the context of the current subroutine call.


3
대박. 그 명령이하는 일을 배울뿐만 아니라 "type"명령도 배웁니다. 감사합니다 :)

2
TIL bash에는 내장 help명령이 있습니다
nibot

대답뿐만 아니라 과정을 가르치기 위해 두 번 공감 할 수 있습니다.
dmckee --- 전 운영자 고양이

@Muu, @nibot, @dmckee : 또한 type type, type help, help typehelp help: 실행 재미있을 수
enzotib

10

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


2

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


그가 나에게 '유형'을 가르쳐 주면서 나는 enzotib의 대답을 고르지 만 감사합니다. 많은 감사하지만 :)

0

출력 형식화 방법을 제어하기 위해 변수로 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.