Функция ksh возвращает 0 вместо "?" - PullRequest
0 голосов
/ 11 сентября 2018

Я столкнулся с проблемой, что команда 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 Пн 20 февраля 02:37:52 EST 2017

  • тот же вывод 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 query
  • сохраняет результат во временном файле
  • удаляет заголовок (имя столбца) и символ \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 получает значение ?

Странно,

  • в одной среде функция возвращает неправильно a 0, поскольку она интерпретирует $RET как $?
  • в другой среде, которую она возвращает правильно a ?

функция get_value находится в сценарии ksh script_A.ksh
script_A.ksh вызывается в другом сценарии ksh script_B.ksh
скрипт script_B.ksh запускается как фоновое задание nohup ksh script_B.ksh &

Кто-нибудь сталкивался с такой же проблемой, делаетУ кого-нибудь есть идеи для анализа этой проблемы, пожалуйста?

Заранее спасибо.

...