Обычно я предпочитаю сохранять все отладочные выходные данные скрипта в файле, поэтому у меня получится что-то вроде:
exec 2> somefile
set -xv
Это очень хорошо работает в bash, но я заметил, что в ksh это ведет себя по-другому, когда дело доходит до функций. Я заметил, что когда я делаю это в ksh, вывод не показывает трассировку функции, а только то, что функция была вызвана.
При проведении дополнительного тестирования я заметил, что поведение также зависит от того, как была объявлена функция, если я использую синтаксис ksh:
function doSometime {....}
Все, что я вижу, это вызов функции, однако, если объявить функцию с помощью другого метода, например:
doSomething() {....}
Трассировка работает так, как и ожидалось. Возможно ли заставить set -xv
работать одинаково с обоими типами объявлений функций? Я пробовал, export SHELLOPTS
и это тоже не дало результата.
Я использую ksh93 на Solaris 11.
решение1
Из документации:
Функции, определяемыефункция имясинтаксис и вызываемые по имени выполняются в том же процессе, что и вызывающий объект, и совместно используют все файлы и текущий рабочий каталог с вызывающим объектом. Ловушки, пойманные вызывающей функцией, сбрасываются до действия по умолчанию внутри функции.
Тогда как
Функции, определенные с помощьюимя() синтаксис и функции, определенные с помощью синтаксиса имени функции, которые вызываются с помощью специального встроенного . выполняются в среде вызывающего иподелиться всеми переменными и ловушками с вызывающей стороной.
Решение — не использовать function
ключевое слово; придерживаться стандартной формы определений функций.
В качестве альтернативы, если вас интересуют только несколько функций, typeset -tf fname
будет просто трассироваться функция fname
(если она была определена с помощью function
ключевого слова).
Чтобы остановить отслеживание:typeset +tf fname
Чтобы отследить все такие функции в ksh93:typeset -tf $(typeset +f)
Чтобы увидеть, какие функции отслеживаются:typeset +tf
Чтобы остановить отслеживание всех функций:typeset +tf $(typeset +tf)