ksh函数返回0而不是“?”

时间:2018-09-11 13:40:46

标签: linux function shell ksh

我遇到了一个问题,旧版ksh脚本中的ksh命令在一个环境中的行为很奇怪,而在另一个环境中却没有。

这2个环境具有:

  • 相同版本的ksh 版本AJM 93u + 2012-08-01
  • .profile中的内容几乎相同
  • cat /proc/version的输出相同
      

    Linux版本3.10.0-514.10.2.el7.x86_64(mockbuild@x86-039.build.eng.bos.redhat.com)(gcc版本4.8.5 20150623(Red Hat 4.8.5-11)( GCC))#1 SMP 2017年2月20日星期一东部标准时间

  • locale的相同输出:
      

    LANG = C
      LC_CTYPE =“ C”
      LC_NUMERIC =“ C”
      LC_TIME =“ C”
      LC_COLLATE =“ C”
      LC_MONETARY =“ C”
      LC_MESSAGES =“ C”
      LC_PAPER =“ C”
      LC_NAME =“ C”
      LC_ADDRESS =“ C”
      LC_TELEPHONE =“ C”
      LC_MEASUREMENT =“ C”
      LC_IDENTIFICATION =“ C”
      LC_ALL =

在此旧版ksh脚本中,有一个函数谁

  • 执行SQL查询
  • 将结果存储在一个临时文件中
  • 从临时文件中删除标题(列名)和\r特征,
  • 将值分配给变量
  • 通过echo返回该变量的值作为函数的结果

这是此功能的实现示例

function get_value {

  # A temp file to store sql query result
  TEMP_FILE="/tmp/get_value_tmp.txt"

  # here's a bloc of code that executes a sql query
  # then store the result in ${TEMP_FILE}
  # execute_sql_query is just a pseudocode who launches database request program

  if execute_sql_query << EOF
    # ...
    # code do send request against database
    # write the result to the tmp file ${TEMP_FILE}
    # ...
EOF

  then

    # removing the title (column name) and \r characte from the temporary file
    # assign the value to a variable RET
    RET=`tail -n +2 $TEMP_FILE | tr -d '\r'`

    # the varible is returned as the result of this function
    echo $RET

  else

    # in case of sql query execution fails
    # CR is a variable who gets error code of execute_sql_query
    CR=$?

    # retrun error code as function result
    echo $CR
  fi
}

sql查询的结果已导出到${TEMP_FILE},在此${TEMP_FILE}中,我们有:

val_str
?

当变量RET获得值?

奇怪的是,

  • 在一个环境中,该函数错误地返回 一个0,因为它将$RET解释为$?
  • 在另一个环境中,它会正确返回 ?

函数get_value在ksh脚本script_A.ksh
script_A.ksh在另一个ksh脚本script_B.ksh中被调用
script_B.ksh

将脚本nohup ksh script_B.ksh &作为后台作业启动

有人遇到过同样的问题吗,请问有人有分析这个问题的想法吗?

谢谢。

0 个答案:

没有答案