Я использую Ubuntu 10.10 с openbox, работающим сверху. Сегодня я заметил команду, которая называется caller
, однако там нет справочной страницы, она не отвечает ни на какие входные данные (или --help) и не находит их.
Есть идеи, что это?
Я использую Ubuntu 10.10 с openbox, работающим сверху. Сегодня я заметил команду, которая называется caller
, однако там нет справочной страницы, она не отвечает ни на какие входные данные (или --help) и не находит их.
Есть идеи, что это?
Ответы:
Бегать
type caller
и вы увидите, что это встроенная оболочка. Бег
help caller
покажет свою функцию, о чем также сообщается на странице руководства bash. кратко
Return the context of the current subroutine call.
help
команду
type type
, type help
, help type
и help help
может быть интересно работать :)
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.
Обратите внимание, что вы можете 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