поведение set -xv в ksh и bash

поведение set -xv в ksh и bash

Обычно я предпочитаю сохранять все отладочные выходные данные скрипта в файле, поэтому у меня получится что-то вроде:

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)

Связанный контент