Korn Shell 93:函数发送非空值,但调用函数获取空值

时间:2014-05-12 01:02:03

标签: function shell ksh

读者:

我花了几天时间调查以下事件而没有成功找出原因。我正在撰写关于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
}

1 个答案:

答案 0 :(得分:0)

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

如果之前使用 ksh88 正常工作,如果您没有对各个功能进行良好测试,则可能会出现问题,如 ksh88 ksh93 有许多微妙而不那么微妙的差异。

矛盾的是, ksh93 更容易作为/bin/sh(神秘的Bourne shell :-)的替代品而不是 ksh88 的替代品。

原因是 ksh88 引入了对 ksh93 进一步增强并更改的shell扩展。

可能涉及您的问题的一个示例是算术,其仅限于 ksh88 中的整数算术并且已扩展到浮点 ksh93的

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

请提供正确的代码示例,说明如何确定ToDo值。