背景循环问题

时间:2011-03-24 21:49:07

标签: bash

我正在扩展我对bash脚本的了解。我遇到了以下片段:

!/bin/bash
# background-loop.sh

for i in 1 2 3 4 5 6 7 8 9 10            # First loop. 
do
  echo -n "$i "
done & # Run this loop in background.
   # Will sometimes execute after second loop.

echo   # This 'echo' sometimes will not display.

for i in 11 12 13 14 15 16 17 18 19 20   # Second loop.
do
  echo -n "$i "
done  

echo word   # This 'echo' sometimes will not display.

看来这个片段输出是不确定的;我想知道为什么......

编辑:到目前为止;在10次尝试中,“word”始终显示

EDIT2: 样本输出:

11 1 12 13 14 2 15 3 16 4 17 5 18 6 19 7 20 8 9 word
1 11 12 13 2 14 3 15 4 16 5 17 6 18 7 19 8 20 9 10 word
11 12 13 14 1 15 16 17 2 18 3 19 4 20 5 6 word

3 个答案:

答案 0 :(得分:4)

在后台运行的循环或任何命令与脚本的其余部分同时运行。如果您有多核计算机,它可能在不同的处理器上运行。事物的顺序取决于您的核心数量,系统的繁忙程度以及操作系统调度程序的奇想。

从多个进程到相同的终端/文件/等等的大量I / O,您甚至可能看到输出混淆。

答案 1 :(得分:3)

基本上这里发生的事情是你有2个进程同时运行。在这种情况下,您无法预测它们将以何种顺序执行。第一个for循环和第二个for循环的每个输出组合都是可能的。

答案 2 :(得分:0)

您可以按如下方式在脚本中等待bg任务:

# create a sentinel for exiting (is this the right term?)
export sentinel=".stopBgTask.$$"
# Run in the background and wait for sentinel to be created
i=1
while [ ! -e "$sentinel" ]
do echo $i
   i=$(($i + 1))
   sleep 1
done & # uncomment the & when you have no script errors

echo "Parent sleeping for a few seconds"
sleep 3
echo "stop the background task" > $sentinel
echo "Waiting for bg task to end..."
wait $! # wait for last bg task to end (kill $! would work too)
rm $sentinel
echo "We are done!"