read循环+在while循环中创建aproccess

时间:2010-06-20 13:12:51

标签: shell unix scripting ksh

以下测试脚本存在问题。当我在脚本中添加行(sleep 5 )&时,while read循环不会读取文件中的所有行,而只会打印第一行。

但是当我从脚本中删除( sleep 5 )&时,脚本会打印文件中定义的所有行。

为什么( sleep 5 )&会导致这种情况?

如何解决问题?我想在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 :(得分:0)

您提供的代码会运行并打印文件中的每一行。

因为你没有等待

( sleep 5 ) &

子进程,它对进程执行没有影响。这是你写的精确代码吗?

答案 1 :(得分:0)

这似乎是特定版本的ksh中的一个错误。我从ksh 93s +获得相同的效果,但不是来自bash,ash,pdksh,zsh或ksh 93t +。

答案 2 :(得分:0)

这个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