以下测试脚本有问题。当我(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 版本比该版本旧(您应该在问题中提到版本!),您可能会观察到这个错误。