Що таке команда «викликає»?


12

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

Будь-яка ідея, що це?

Відповіді:


16

Біжи

type caller

і ви побачите, що це вбудована оболонка. Біг

help caller

покаже свою функцію, про яку повідомляється також на сторінці керівництва bash. Коротко

Return the context of the current subroutine call.


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 :

#!/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.


2

Це команда, вбудована в оболонку: man bash(Тоді шукайте "абонента")
Це можна використовувати для друку трасування стека.


Дякую, хоча я вибрав відповідь ензотиба, коли він також навчав мене "типу". Велике спасибі, хоча :)

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.