Qu'est-ce que la commande «appelant»?

12

J'utilise Ubuntu 10.10 avec openbox en cours d'exécution. J'ai remarqué aujourd'hui une commande appelée caller, mais il n'y a pas de page de manuel, elle ne répond à aucune entrée (ou --help) et whereis ne la trouve pas.

Une idée de ce que c'est?

Gilles 'SO- arrête d'être méchant'
la source

Réponses:

16

Courir

type caller

et vous verrez que c'est un shell intégré. Fonctionnement

help caller

montrera sa fonction, également indiquée dans la page de manuel de bash. Brièvement

Return the context of the current subroutine call.

enzotib
la source
3
Impressionnant. Non seulement j'ai appris ce que fait cette commande, j'apprends aussi la commande "type". Merci :)
2
TIL bash a une helpcommande
intégrée
Ce que je pourrais voter deux fois pour enseigner non seulement la réponse mais aussi le processus.
dmckee --- chaton ex-modérateur
@Muu, @nibot, @dmckee: aussi type type, type help, help typeet help helppourrait être amusant de courir :)
enzotib
10

La callercommande is builtin (non spécifiée par POSIX) est apparue dans Bash version 3.0 et renvoie le contexte de tout appel de sous-programme actif. Voir: Bash-Builtins pour plus de lecture.

Syntaxe:

caller [FRAMENUMBER]

Si le numéro de trame est fourni sous la forme d'un entier non négatif, il affiche le numéro de ligne, le nom du sous-programme et le fichier source correspondant à cette position dans la pile des appels d'exécution en cours.

Sans aucun paramètre, l' appelant affiche le numéro de ligne et le nom de fichier source de l'appel de sous-programme en cours.

Vérifiez la trace de pile simple suivante sur le wiki Bash Hackers :

#!/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

Production:

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

Voici un exemple d'une diefonction décente pour rechercher les erreurs dans les scripts modérément complexes:

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

Pour un débogage plus sophistiqué, les fonctionnalités de débogage étendues de Bash sont disponibles et un certain nombre de paramètres spéciaux qui donnent plus de détails que l'appelant (par exemple BASH_ARG{C,V}). Des outils tels que Bashdb peuvent vous aider à utiliser certaines des fonctionnalités de débogage les plus avancées de Bash.

Kenorb
la source
2

Il s'agit d'une commande intégrée au shell: man bash(Ensuite, recherchez «appelant»).
Elle peut être utilisée pour imprimer une trace de pile.

smoking
la source
Merci bien que j'ai choisi la réponse d'enzotib car il m'a aussi appris à "taper". Merci beaucoup :)
0

Notez que vous pouvez readproduire la sortie de callerdans des variables, pour contrôler la façon dont sa sortie est formatée:

stacktrace() {
  local frame=0 LINE SUB FILE
  while read LINE SUB FILE < <(caller "$frame"); do
    echo "${SUB} @ ${FILE}:${LINE}"
    ((frame++))
  done
}

Démo:

$ 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
dimo414
la source