读者:
我花了几天时间调查以下事件而没有成功找出原因。我正在撰写关于ksh脚本的文章,这些脚本是我在许多HP-UX / PA-RISC和Solaris / Sparc平台上运行多年的ksh88标准,甚至是一些Linux / x86_64平台......直到本周。在使用Korn shell“Version AJM 93u + 2012-08-01”在CentOS 6.4 / x86-x64上运行脚本时,调用者将一些函数返回给调用者的非空值作为空值。
具体来说,在下面编辑的摘录中,变量ToDo在fSendReqToSvr返回之前始终包含fSendReqToSvr中的值。当fSendReqToSvr在fGetFileStatusFromSvr中返回时,Todo被赋予空值。此脚本的上下文是从cron运行的另一个ksh脚本调用的子项。我已经包含了重新分配stdout和stderr的代码,以确定这有多大意义。
我不明白什么?
OS: CentOS-6.4(x86-64)开发安装 Korn Shell: 版本:AJM 93u + 2012-08-01 包装:Ksh.x86_64 20120801-10.el6
...
function fLogOpen
{
...
exec 3>$1 #C# Assigned Fd 3 to a log file
#C# stdout and stderr are redirected to log file as insurance that
#C# no “errant” output from script (1700 lines) “escapes” from script.
#C# stdout and stderr restored in fLogClose.
exec 4>&1
exec 1>&3
exec 5>&2
exec 2>&3
...
}
...
#C# Invokes curl on behalf of caller and evaluates
function fSendReqToSvr
{
typeset Err=0 ... \
ToDo=CONTINUE ... \
CL=”$2” ...
...
curl $CL > $CurlOutFFS 2>&1 &
gCurlPId=$!
while (( iSecsLeft > 0 )) ; do
...
#C# Sleep N secs, check status of curl with “kill -0 $gCurlPId”
#C# and if curl exited, get return code from “wait $gCurlPId”.
...
done
...
#C# Evaluate curl return code and contents of CurlOutFFS file to
#C# determine what to set ToDo to.
...
print –n -– “$ToDo” #C# ToDo confirmed to always have a value here
return $Err
}
...
function fGetFileStatusFromSvr
{
typeset Err=0 ... \
ToDo=CONTINUE ... \
...
...
ToDo=$( fSendReqToSvr “$iSessMaxSecs” “$CurlCmdLine” )
Err=$?
#C# ToDo contains null here
...
return $Err
}
答案 0 :(得分:0)
这里的一个问题是我们没有看到负责ToDo
结果的代码。
如果之前使用 ksh88 正常工作,如果您没有对各个功能进行良好测试,则可能会出现问题,如 ksh88 和 ksh93 有许多微妙而不那么微妙的差异。
矛盾的是, ksh93 更容易作为/bin/sh
(神秘的Bourne shell :-)的替代品而不是 ksh88 的替代品。
原因是 ksh88 引入了对 ksh93 进一步增强并更改的shell扩展。
可能涉及您的问题的一个示例是算术,其仅限于 ksh88 中的整数算术并且已扩展到浮点 ksh93的
任何期望整数值的实用程序都可以从 ksh88 中的算术表达式中提供结果。 它可能会阻塞 ksh93 中返回的浮点结果。
请提供正确的代码示例,说明如何确定ToDo
值。