¿Qué es el comando "llamador"?

12

Estoy ejecutando Ubuntu 10.10 con openbox ejecutándose en la parte superior. Hoy noté un comando llamado caller, sin embargo, no hay una página de manual, no responde a ninguna entrada (o --help) y whereis no la encuentra.

¿Alguna idea de lo que es?

Gilles 'SO- deja de ser malvado'
fuente

Respuestas:

16

correr

type caller

y verá que es un shell incorporado. Corriendo

help caller

mostrará su función, informada también en la página de manual de bash. Brevemente

Return the context of the current subroutine call.

enzotib
fuente
3
Increíble. No solo aprendí lo que hace ese comando, también aprendí el comando "tipo". Gracias :)
2
TIL bash tiene un helpcomando
incorporado
Lo cual podría votar dos veces por enseñar no solo la respuesta sino también el proceso.
dmckee --- ex-gatito moderador
@Muu, @nibot, @dmckee: también type type, type help, help typey help helppodría ser divertido para funcionar :)
enzotib
10

El callercomando 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 diefunció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.

kenorb
fuente
2

Es un comando integrado de shell: man bash(luego busque 'llamador')
Se puede usar para imprimir un seguimiento de pila.

esmoquin
fuente
Gracias aunque elegí la respuesta de enzotib ya que él también me enseñó 'tipo'. Muchas gracias :)
0

Tenga en cuenta que puede readgenerar la salida calleren variables para controlar cómo se formatea su salida:

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

Manifestación:

$ 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
fuente