什么是“呼叫者”命令?


12

我正在运行Ubuntu 10.10,顶部运行openbox。我今天注意到一个名为的命令caller,但是没有手册页,它不响应任何输入(或--help),而在whereis找不到它。

知道是什么吗?

Answers:


16

type caller

您将看到它是内置的shell。跑步

help caller

将显示其功能,并在bash的手册页中进行了报告。简要地

Return the context of the current subroutine call.


3
太棒了 我不仅学习了该命令的功能,还学习了“ type”命令。谢谢:)

2
TIL bash具有内置help命令
nibot

我可以两次投票,不仅要教答案,还要教过程。
dmckee ---前主持人小猫,

@Muu,@nibot,@dmckee:同样type typetype helphelp 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

这是一个shell内置命令:(man bash然后搜索“ caller”)
,可用于打印堆栈跟踪。


谢谢,尽管我选择了恩佐提布的答案,因为他也教我“打字”。虽然非常感谢:)

0

请注意,您可以read输出callerinto变量,以控制其输出的格式:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.