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