如何在 KSH“while read”循环中创建新的后台进程?

如何在 KSH“while read”循环中创建新的后台进程?

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

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

为什么( sleep 5 ) &会造成这样的情况呢?

那么如何解决这个问题呢?我想sleep在 while 循环中创建一个新进程(这只是一个例子):

$ more test 
#!/bin/ksh  
while read -r line ; do
    echo Read a line:
    echo $line

    ( sleep 5 )&
    RESULT=$!
    echo Started background sleep with process id $RESULT

    sleep 1
    echo Slept for a second

    kill $RESULT 
    echo Killed background sleep with process id $RESULT
done < file
echo Completed 

在我的Linux上,当使用以下内容时file

$ more file 
123 aaa 
234 bbb 
556 ccc

...运行./test只会给我:

读一行:
123 AAA
已启动后台睡眠,进程号为 4181
睡了一会
终止后台睡眠进程(进程号为 4181)
完全的

答案1

来自 ksh93s 的 Ksh 更新日志:

$!06-10-23修复了从子 shell 启动的后台作业影响的值的错误。

如果您的 ksh 版本比该版本旧(您应该在问题中提到版本!),您可能会观察到这个错误。

相关内容