以下测试脚本存在问题。当我在脚本中添加行(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
答案 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