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?
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?
Réponses:
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.
help
commande
type type
, type help
, help type
et help help
pourrait être amusant de courir :)
La caller
commande 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 die
fonction 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.
Notez que vous pouvez read
produire la sortie de caller
dans 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