我正在编写一个bash脚本,该脚本开始一些模拟,然后根据这些模拟生成的输出绘制一堆图。
我想并行运行模拟,但是需要脚本“阻止”等待所有模拟完成,然后再继续进行图生成脚本。
pids=()
for file in inputdir/*
do
./run_simulation $file &> /dev/null & pids+=($!)
done
# synchronization barrier
for pid in ${pids[*]}; do
wait $pid
done
当前的脚本工作正常,我只是很好奇:与 $ {pids [@]}相比,使用 $ {pids [*]} 有什么区别? (我的脚本使用前者。)
答案 0 :(得分:4)
在实践中,可以确定Announcement.find(params[:id])
仅包含合理的合理值并不重要。 (如果它包含可能存在于PID中的数字字符,那么您的值可能会被IFS
进行的额外操作破坏)。
但是,${pids[*]}
是正确的,只要它的语义是您想要的:将数组中的每个项目扩展为一个单词。
运行"${pids[@]}"
时,shell将列表扩展为单个字符串,并用${pids[*]}
中的第一个字符(默认为空格)分隔后续元素。然后对结果进行字符串拆分(将其从单个字符串拆分回单独的项目列表),并将该拆分操作的每个结果扩展为全局。
这是一个具体的例子:
IFS
...将作为两行输出发出(如https://ideone.com/mqtEfQ所示):
pids=( 123 456 789 012 )
IFS=02468 # now entering Insanity World!
echo "${pids[@]}" # still works correctly
echo ${pids[*]} # not so much
...由于123 456 789 012
1 3 5 7 9 1
中存在的数字用于拆分为单独的IFS
参数,而不是作为文字数据传递。