Я запускаю 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 :
#!/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