El caller
comando is builtin (no especificado por POSIX) apareció en Bash versión 3.0 y devuelve el contexto de cualquier llamada de subrutina activa. Ver: Bash-Builtins para más lectura.
Sintaxis:
caller [FRAMENUMBER]
Si el número de trama se proporciona como un número entero no negativo, muestra el número de línea, el nombre de la subrutina y el archivo fuente correspondiente a esa posición en la pila de llamadas de ejecución actual.
Sin ningún parámetro, la persona que llama muestra el número de línea y el nombre del archivo fuente de la llamada de subrutina actual.
Verifique el siguiente seguimiento de pila simple en 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
Salida:
12 f1 ./callertest.sh
13 f2 ./callertest.sh
14 f3 ./callertest.sh
16 main ./callertest.sh
*** an error occured ***
Aquí hay una muestra de una die
función decente para rastrear errores en scripts moderadamente complejos:
{ bash /dev/stdin; } <<<$'f(){ g; }\ng(){ h; }\nh(){ while caller $((n++)); do :; done; }\nf'
Para una depuración más sofisticada, las funciones de depuración extendida de Bash están disponibles y una serie de parámetros especiales que brindan más detalles que la persona que llama (por ejemplo BASH_ARG{C,V}
). Herramientas como Bashdb pueden ayudarlo a usar algunas de las funciones de depuración más avanzadas de Bash.