Function KornShell93:函数发送非空值,但调用函数获取空值

Function KornShell93:函数发送非空值,但调用函数获取空值,function,shell,ksh,Function,Shell,Ksh,读者: 我花了几天时间调查了以下事件,但没有成功查明原因。我写的是关于我根据ksh88标准编写的ksh脚本,这些脚本在许多HP-UX/PA-RISC和Solaris/Sparc平台上运行了多年,甚至在一些Linux/x86_64平台上运行了多年……直到本周。在CentOS 6.4/x86-x64上使用Korn shell“版本AJM 93u+2012-08-01”运行脚本时,某些函数返回给调用者的非空值将由调用者作为空值检索 具体地说,在下面编辑的摘录中,变量ToDo始终在fSendReqToS

读者:

我花了几天时间调查了以下事件,但没有成功查明原因。我写的是关于我根据ksh88标准编写的ksh脚本,这些脚本在许多HP-UX/PA-RISC和Solaris/Sparc平台上运行了多年,甚至在一些Linux/x86_64平台上运行了多年……直到本周。在CentOS 6.4/x86-x64上使用Korn shell“版本AJM 93u+2012-08-01”运行脚本时,某些函数返回给调用者的非空值将由调用者作为空值检索

具体地说,在下面编辑的摘录中,变量ToDo始终在fSendReqToSvr返回之前在fSendReqToSvr中包含一个值。当fSendReqToSvr在fGetFileStatusFromSvr中返回时,Todo被分配一个空值。此脚本的上下文作为从cron运行的另一个ksh脚本调用的子脚本。我已经包含了重新分配stdout和stderr的代码,这可能是有意义的

我不明白什么

操作系统: CentOS-6.4 x86-64开发安装 科恩壳牌: 版本:AJM 93u+2012-08-01 包装:Ksh.x86_64 20120801-10.el6


这里的一个问题是,我们没有看到负责ToDo结果的代码

如果这在ksh88之前正常工作,那么如果您没有对单个函数进行良好的测试,则可能会出现问题,因为ksh88和ksh93有许多细微的差异

矛盾的是,ksh93比ksh88更容易代替神话中的伯恩贝壳

这是因为ksh88在shell中引入了扩展,这些扩展在ksh93中得到了进一步的增强和更改

一个可能涉及您的问题的例子是算术,它在ksh88中仅限于整数算术,在ksh93中扩展为浮点

任何需要整数值的实用程序都可以从ksh88中的算术表达式中获得结果。 它可能会阻塞ksh93中返回的浮点结果


请提供一个适当的代码示例,说明如何确定ToDo值。

请尝试提供一个示例。唯一会跳出来的是,您的代码包含了“而不是常规的”排版引号,这可能会导致意外的结果。您开始使用其他编辑器了吗?;另外,我假设你说空值时是指一个空字符串。Ksh命令替换自动计算结果。自从发布这个问题以来,我几乎没有时间花在这个问题上。谢谢你的评论。如果可能,将发布MCVE。谢谢你。1.关于细微的和不太细微的区别…,我在88'的实现中遇到了相同的问题,但是,你能给我介绍一下描述88'和93'之间的差异的资料吗?All:在发布MCVE之前,请注意变量ToDo-在所有输出中-始终有一个值CONTINUE,NEXT_FILE,NEXT_SVR,在fSendReqToSvr的print-n-$ToDo行退出;也就是说,每个日志文件都确认了这一点。再次感谢。ksh88的问题是,它被许可给了许多不同的供应商,导致他们在开始添加功能(如i18n)时使用了同样多的方言。ksh93是一项持续20年的工作,功能不断增加,没有稳定的分支。ksh93文件见kornshell.com,其中概述了ksh88和ksh93的区别。
...
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
}