等待多个bash进程完成时,应该使用$ {pids [*]}还是$ {pids [@]}?

时间:2019-02-13 23:10:55

标签: bash

我正在编写一个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 [*]} 有什么区别? (我的脚本使用前者。)

1 个答案:

答案 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参数,而不是作为文字数据传递。