在 ksh 与 bash 中设置 -xv 行为

在 ksh 与 bash 中设置 -xv 行为

通常我喜欢将脚本的所有调试输出都保存到一个文件中,所以我会有类似的内容:

exec 2> somefile
set -xv

这项工作在 bash 中非常有用,但我注意到在 ksh 中它在函数方面的行为有所不同。我注意到,当我在 ksh 中执行此操作时,输出不显示函数跟踪,仅显示该函数被调用。

在进行一些额外的测试时,我注意到如果我使用以下 ksh 语法,该行为还取决于函数的声明方式:

function doSometime {....}

我所看到的只是函数调用,但是如果使用其他方法声明函数,例如

doSomething() {....}

跟踪按预期工作。两种类型的函数声明是否可以以set -xv相同的方式工作?我尝试过export SHELLOPTS,但这也没有什么区别。

我在 Solaris 11 上使用 ksh93。

答案1

从文档中:

定义的函数功能 姓名语法和按名称调用在与调用者相同的进程中执行,并与调用者共享所有文件和当前工作目录。 调用者捕获的陷阱将重置为函数内的默认操作。

然而

定义的函数姓名() 语法和使用函数名语法定义的函数,并使用 .特殊的内置函数在调用者的环境中执行与调用者共享所有变量和陷阱。

解决方案是不使用function关键字;坚持函数定义的标准形式。

或者,如果您只对几个函数感兴趣,typeset -tf fname则只需跟踪该函数fname(如果它是使用关键字定义的function)。

要停止跟踪:typeset +tf fname

要跟踪 ksh93 中的所有此类函数:typeset -tf $(typeset +f)

要查看跟踪了哪些函数:typeset +tf

要停止跟踪所有函数:typeset +tf $(typeset +tf)

相关内容