KornShell - 全局设置"-x"(调试)标志?

C. *_*oss 8 debugging shell scripting ksh script-debugging

有没有办法在全局的KornShell(ksh)脚本上设置调试模式(set -x)?目前我似乎做了类似以下的事情:

a(){
   set -x
   #commands
}

b(){
   set -x
   #more commands
}

set-x 
a
#commands
b
Run Code Online (Sandbox Code Playgroud)

我真的只想在一个地方调用set-x命令.

注意:这完全在AIX上的KSH88中.

例:

#!/bin/ksh
set -x

a(){
   echo "This is A!"
}

b(){
   echo "This is B!"
}

a
echo "Outside"
b
Run Code Online (Sandbox Code Playgroud)
dev2:/home/me-> ./testSetX
+ a
This is A!
+ echo Outside
Outside
+ b
This is B!
dev2:/home/me->

dan*_*uer 8

这是HP-UX计算机上的ksh88:

me@host ..dev/
$ cat ./test/verbose
#!/bin/ksh
set -x

hello() {
  print $1
}

hello kapow!
exit

me@host..dev/
$ ./test/verbose    
+ hello kapow!
+ print kapow!
kapow!
+ exit
Run Code Online (Sandbox Code Playgroud)

看起来确实看起来很好.我验证它在第一次函数调用之前的任何地方都可以使用"set -x".

我搬到了AIX系统,遇到了你描述的问题.当函数被定义为function a {或者a() {在AIX ksh88中时,它set -x似乎不会继承到函数局部范围.在同一个AIX框中切换到ksh93,使用新function a {语法声明的函数也不会将外部set -x带入内部作用域.但是,ksh93的行为与POSIX sh(以及其他平台上的ksh88)的行为类似set -x,在旧a(){方法中定义函数时将函数传递给函数.这可能是由于ksh93中的向后兼容性,它在尝试以旧方式定义函数时模拟旧行为.

因此,您可以暂时将解释器切换到ksh93以进行调试,然后如果您不喜欢使用更长的数组,关联数组,浮点数学,命名空间支持和鲁棒10x改进,则可以切换回ksh88. ksh93带来的执行速度.;)因为在AIX上使用ksh88看起来答案是"不,你不能这样做".:(


max*_*zig 5

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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

排版注释掉

$ ksh test.ksh 
15: foo
Hello
16: bar
World
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

排版注释掉

$ ksh test.ksh
15: foo
Hello
16: bar
10: print World
World
Run Code Online (Sandbox Code Playgroud)

重击输出

typeset注释掉并print替换为echo:

$ bash test.ksh
15: foo
6: echo Hello
Hello
16: bar
10: echo World
World
Run Code Online (Sandbox Code Playgroud)

(Fedora 17上的bash 4.2.39(1))

在Fedora 17上的zsh 5.0.2下输出相同

结论

使用Ksh时,仅使用ksh93和fnname()函数定义语法时,全局变量set -x也具有局部范围。所述typeset -ft基于的解决方法是相对轻的方法,使所有功能命令跟踪。

在bash(和zsh)中,全局set -x工作符合预期,即,它对于所有功能也具有局部作用域。

因此,因此,使用bash而不是ksh编写新脚本时可能是更好的选择。

附带说明:bash可能比ksh88更可移植-尤其是比ksh93更可移植。