Was ist der "Anrufer" -Befehl?

12

Ich verwende Ubuntu 10.10 mit Openbox als oberstem Betriebssystem. Ich habe heute einen Befehl namens bemerkt caller, es gibt jedoch keine Manpage, er reagiert nicht auf Eingaben (oder --help) und whereis findet ihn nicht.

Irgendeine Idee was es ist?

Gilles 'SO - hör auf böse zu sein'
quelle

Antworten:

16

Lauf

type caller

und Sie werden sehen, es ist eine eingebaute Shell. Laufen

help caller

zeigt seine Funktion, die auch in der Handbuchseite von bash angegeben ist. Kurz

Return the context of the current subroutine call.

Enzotib
quelle
3
Genial. Ich habe nicht nur gelernt, was dieser Befehl bewirkt, sondern auch den Befehl "type". Danke :)
2
TIL Bash hat einen eingebauten helpBefehl
Nibot
Dem konnte ich zweimal zustimmen, weil ich nicht nur die Antwort, sondern auch den Prozess gelehrt habe.
dmckee --- Ex-Moderator Kätzchen
@Muu, @nibot, @dmckee: auch type type, type help, help typeund help helpkönnte Spaß machen zu laufen :)
enzotib
10

Der callerBefehl is builtin (nicht von POSIX angegeben) ist in Bash Version 3.0 enthalten und gibt den Kontext eines aktiven Unterprogrammaufrufs zurück. Weitere Informationen finden Sie unter: Bash-Builtins .

Syntax:

caller [FRAMENUMBER]

Wenn die Frame-Nummer als nicht negative Ganzzahl angegeben wird, werden die Zeilennummer, der Name der Unterroutine und die Quelldatei angezeigt, die dieser Position im aktuellen Ausführungsaufrufstapel entsprechen.

Ohne Parameter zeigt der Aufrufer die Zeilennummer und den Quellendateinamen des aktuellen Unterprogrammaufrufs an.

Überprüfen Sie den folgenden Simple Stack Trace im 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

Ausgabe:

12 f1 ./callertest.sh
13 f2 ./callertest.sh
14 f3 ./callertest.sh
16 main ./callertest.sh
*** an error occured ***

Hier ist ein Beispiel einer anständigen dieFunktion zum Aufspüren von Fehlern in mäßig komplexen Skripten:

{ bash /dev/stdin; } <<<$'f(){ g; }\ng(){ h; }\nh(){ while caller $((n++)); do :; done; }\nf'

Für ein komplexeres Debugging stehen erweiterte Bash-Debugging-Funktionen und eine Reihe von speziellen Parametern zur Verfügung, die detaillierter sind als der Aufrufer (z BASH_ARG{C,V}. B. ). Tools wie Bashdb unterstützen Sie bei der Verwendung einiger erweiterter Debug-Funktionen von Bash.

Kenorb
quelle
2

Es ist ein Shell-eingebauter Befehl: man bash(Dann suche nach 'caller')
Er kann verwendet werden, um einen Stack-Trace zu drucken.

Smoking
quelle
Vielen Dank, obwohl ich Enzotibs Antwort gewählt habe, da er mir auch "Typ" beigebracht hat. Vielen Dank :)