Я протестировал глобальный set -x
с помощью ksh88 (в Solaris 10) и ksh93 (Fedora 17), и обе глобальные команды set -x
в верхней части скрипта не имеют функционально-локальной области видимости (то есть не имеют есть локальные эффекты).
В качестве обходного пути вы можете включить локальную трассировку команд для всех функций в области (после того, как они определены) и до их вызова с помощью typeset
:
$ cat test.ksh
PS4='$LINENO: '
set -x
function foo {
print Hello
}
bar() {
print World
}
typeset -ft `typeset +f`
foo
bar
Вывод под ksh88 (Solaris 10):
$ ksh test.ksh
13: typeset +f
13: typeset -ft bar foo
15: foo
1: print Hello
Hello
16: bar
1: print World
World
набрано закомментировано
$ ksh test.ksh
15: foo
Hello
16: bar
World
Вывод в ksh93 (Fedora 17):
$ ksh test.ksh
13: typeset +f
13: typeset -ft 'bar()' foo
15: foo
6: print Hello
Hello
16: bar
10: print World
World
набрано закомментировано
$ ksh test.ksh
15: foo
Hello
16: bar
10: print World
World
Вывод под bash
typeset
закомментировано и print
заменено на эхо:
$ bash test.ksh
15: foo
6: echo Hello
Hello
16: bar
10: echo World
World
(bash 4.2.39 (1) на Fedora 17)
Тот же вывод в zsh 5.0.2 на Fedora 17.
Заключение
При использовании Ksh только с ksh93 и синтаксисом определения функции fnname()
глобальный set -x
также имеет локальную область действия. Обходной путь на основе typeset -ft
- это относительно легкий способ включить трассировку команд для всех функций.
В bash (и zsh) глобальный set -x
работает должным образом, то есть он также имеет локальную область видимости для всех функций.
Таким образом, при написании новых сценариев использование bash вместо ksh может быть лучшей альтернативой из-за этого.
В качестве примечания: bash, вероятно, даже более переносим, чем ksh88 - особенно более переносим, чем ksh93.