Что такое команда «вызывающий»?

12

Я использую Ubuntu 10.10 с openbox, работающим сверху. Сегодня я заметил команду, которая называется caller, однако там нет справочной страницы, она не отвечает ни на какие входные данные (или --help) и не находит их.

Есть идеи, что это?

Жиль "ТАК - перестань быть злым"
источник

Ответы:

16

Бегать

type caller

и вы увидите, что это встроенная оболочка. Бег

help caller

покажет свою функцию, о чем также сообщается на странице руководства bash. кратко

Return the context of the current subroutine call.

enzotib
источник
3
Потрясающие. Я не только узнал, что делает эта команда, но и изучил команду «type». Спасибо :)
2
TIL bash имеет встроенную helpкоманду
nibot
Что я мог бы дважды сказать за то, что учил не только ответ, но и процесс.
dmckee --- котенок экс-модератора
@Muu, @nibot, @dmckee: также type type, type help, help typeи help helpможет быть интересно работать :)
enzotib
10

callerЯвляется командой встроенной (не определен POSIX) появилась в Bash версии 3.0 и она возвращает контекст любого активного вызова подпрограммы. Смотрите: Bash-Builtins для дополнительного чтения.

Синтаксис:

caller [FRAMENUMBER]

Если номер кадра указан как неотрицательное целое число, он отображает номер строки, имя подпрограммы и исходный файл, соответствующий этой позиции в текущем стеке вызовов выполнения.

Без какого-либо параметра вызывающая сторона отображает номер строки и имя исходного файла текущего вызова подпрограммы.

Проверьте следующую простую трассировку стека в 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

Выход:

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

Вот пример достойной dieфункции для отслеживания ошибок в умеренно сложных сценариях:

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

Для более сложной отладки доступны расширенные функции отладки Bash и ряд специальных параметров, которые дают больше подробностей, чем вызывающий (например BASH_ARG{C,V}). Такие инструменты, как Bashdb, могут помочь в использовании некоторых более продвинутых функций отладки Bash.

kenorb
источник
2

Это встроенная команда оболочки: man bash(затем ищите 'caller').
Она может использоваться для печати трассировки стека.

tuxce
источник
Спасибо, хотя я выбрал ответ энзотиба, так как он научил меня «типу». Хотя
0

Обратите внимание, что вы можете readвыводить callerв переменные, чтобы контролировать, как форматируется их вывод:

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

Демо-версия:

$ 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
источник