Ksh цикл пока ведет себя странно

У меня есть цикл while в ksh, который читает файл и перебирает каждую строку. Вот то же самое содержимое файла (TestCases.txt)

TEST_PROC_1(1)/TEST_1,TEST_2,TEST_3/N/P
TEST_PROC_1(1)/TEST_1,TEST_2,TEST_3/N/N
TEST_PROC_2('CICD_DEMO.txt')/TEST_1,TEST_2,TEST_3/N/N
TEST_FUNC_1(100)/TEST_1,TEST_2,TEST_3/N/P
TEST_FUNC_2/TEST_1,TEST_2,TEST_3/N/N
TEST_PROC_4/TEST_1,TEST_2/N/N
TEST_FUNC_3(3)//N/P

Скрипты, которые читают документ

swd=$(pwd)
export swd

file=${swd}/TestCases.txt

export testCaseIndex=1
export validateTblIndex=1

cat ${file} | while IFS=\/ read procname tablelist hold_data testcase_type
do
    echo "$procname $tablelist $hold_data $testcase_type"

    ksh ${swd}/assets/sh/main.sh "${procname}" "${tablelist}" "${hold_data}" "${testcase_type}" "${testCaseIndex}" "${validateTblIndex}"
    ret=$?
    echo $ret
    (( testCaseIndex+=1 ))
    (( validateTblIndex+=1 ))
done 

Вот проблема

Если я комментирую вызов ksh, он повторяется до последней строки.

TEST_PROC_1(1) TEST_1,TEST_2,TEST_3 N P
0
TEST_PROC_1(1) TEST_1,TEST_2,TEST_3 N N
0
TEST_PROC_2('CICD_DEMO.txt') TEST_1,TEST_2,TEST_3 N N
0
TEST_FUNC_1(100) TEST_1,TEST_2,TEST_3 N P
0
TEST_FUNC_2 TEST_1,TEST_2,TEST_3 N N
0
TEST_PROC_4 TEST_1,TEST_2 N N
0
TEST_FUNC_3(3)  N P
0

Если я раскомментирую, это останавливается на первой строке файла.

TEST_PROC_1(1) TEST_1,TEST_2,TEST_3 N P
0

Пожалуйста, помогите, какие могут быть возможные проблемы. Ksh Call работает нормально, даже я бегу отдельно. У меня есть версия ksh93.

1 ответ

Решение

main.sh также читает из стандартного ввода, который он наследует от цикла, поэтому он потребляет данные, предназначенные для read команда. Учитывая, что это вас удивляет, вы можете просто перенаправить стандартный ввод скрипта с /dev/null,

(Также, если cat ${file} просто заполняет какой-то другой процесс, который производит данные, используйте перенаправление ввода вместо канала.)

while IFS=/ read procname tablelist hold_data testcase_type
do
    echo "$procname $tablelist $hold_data $testcase_type"

    ksh ${swd}/assets/sh/main.sh "${procname}" \
       "${tablelist}" "${hold_data}" "${testcase_type}" \
       "${testCaseIndex}" "${validateTblIndex}" < /dev/null
    ret=$?
    echo $ret
    (( testCaseIndex+=1 ))
    (( validateTblIndex+=1 ))
done < $file

Если main.sh нужно читать из стандартного ввода, использовать другой дескриптор файла для read команда.

while IFS=/ read procname tablelist hold_data testcase_type <&3
do
    echo "$procname $tablelist $hold_data $testcase_type"

    ksh ${swd}/assets/sh/main.sh "${procname}" \
       "${tablelist}" "${hold_data}" "${testcase_type}" \
       "${testCaseIndex}" "${validateTblIndex}" < /dev/null
    ret=$?
    echo $ret
    (( testCaseIndex+=1 ))
    (( validateTblIndex+=1 ))
done 3< $file
Другие вопросы по тегам