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->
这是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看起来答案是"不,你不能这样做".:(
我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)
$ 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)
$ 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更可移植。