цикл чтения + создать доступ в цикле while - PullRequest
2 голосов
/ 20 июня 2010

В следующем тестовом скрипте есть проблема. Когда я добавляю строку (sleep 5 )& в сценарий, цикл while read не читает все строки из файла, а только печатает первую строку.

Но когда я удаляю ( sleep 5 )& из сценария, сценарий печатает все строки, как определено в файле.

Почему ( sleep 5 )& вызывает это?

А как решить проблему? Я хочу создать новый процесс (для которого sleep - просто пример) в цикле while.

$ more test

#!/bin/ksh 
while read -r line ; do 
echo $line
( sleep 5 )&   
RESULT=$!
sleep 1
kill $RESULT
done < file


$ more file
123 aaa
234 bbb
556 ccc

Ответы [ 3 ]

0 голосов
/ 09 июля 2010

Кажется, это ошибка в конкретной версии ksh. Я получаю тот же эффект от ksh 93s +, но не от bash, ash, pdksh, zsh или ksh 93t +.

0 голосов
/ 12 января 2014

Этот скрипт KornShell (ksh) отлично работает для меня с этой версией:

  • echo $KSH_VERSION
    • @(#)MIRBSD KSH R48 2013/08/16

soExample.ksh:

#!/bin/ksh 

#Initialize Variables
file=file
fileContent="123\taaa\n234\tbbb\n556\tccc"

#Function to create File with Input
#Params: 1}Directory 2}File
createBlankFileHere(){
    echo "Entering createFileHere"
    > ${1}
    echo "Exiting createFileHere"
}

#Function to create File with Input
#Params: 1}File 2}String to write to FileName
createFileWithInputHere(){
    echo "Entering createFileWithInputHere"
    > ${1}
    #-e means 'enable interpretation of backslash escapes
    echo -e ${2} >> ${1}
    #print ${2} >> ${1}
    echo "Exiting createFileWithInputHere"
}

#Function to 
#Params: 1} File
readLine(){
    echo "Entering readLine"
    while read -r line ; do 
    echo ${line}
    ( sleep 5 )&   
    RESULT=${!}
    sleep 1
    kill ${RESULT}
    done < ${1}
    echo "Exiting readLine"
}

#-----------
#---Main----
#-----------
echo "Starting: ${PWD}/${0} with Input Parameters: {1: ${1} {2: ${2} {3: ${3}"
createFileWithInputHere ${file} ${fileContent} #function call#
readLine ${file} #function call#
echo "Exiting: ${PWD}/${0}"

soExample.ksh Вывод:

user@foo /tmp
$ ksh soExample.ksh
Starting: /tmp/soExample.ksh with Input Parameters: {1:  {2:  {3:
Entering createFileWithInputHere
Exiting createFileWithInputHere
Entering readLine
123 aaa
234 bbb
556 ccc
Exiting readLine
Exiting: /tmp/soExample.ksh
0 голосов
/ 21 июня 2010

Предоставленный код запускает и печатает каждую строку в файле.

Поскольку вы не ожидаете дочерний процесс

( sleep 5 ) &

, он не влияет на выполнение процесса.Это ТОЧНЫЙ код, который вы написали?

...