Я столкнулся с проблемой, что команда 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 &
Кто-нибудь сталкивался с такой же проблемой, делаетУ кого-нибудь есть идеи для анализа этой проблемы, пожалуйста?
Заранее спасибо.