我正在扩展我对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
答案 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!"