Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在等待多个bash进程完成时,我应该使用${pids[*]}还是${pids[@]}?_Bash - Fatal编程技术网

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

在等待多个bash进程完成时,我应该使用${pids[*]}还是${pids[@]}?,bash,Bash,我正在编写一个bash脚本,启动一些模拟,然后根据这些模拟生成的输出绘制一系列图 我想并行运行模拟,但需要阻止脚本,等待所有模拟完成,然后再转到绘图生成脚本 pids=() for file in inputdir/* do ./run_simulation $file &> /dev/null & pids+=($!) done # synchronization barrier for pid in ${pids[*]}; do wait $pid

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

在实践中,如果您确定IFS只包含一个合理的正常值,这并不重要。如果它包含可能存在于PID中的数字字符,则${pids[*]}执行的额外操作可能会损坏您的值

但是,${pids[@]}是正确的,因为它的语义是您想要的:将数组中的每个项扩展为单个单词

运行${pids[*]}时,shell将列表扩展为单个字符串,并使用默认情况下的第一个字符inIFS(空格)分隔后续元素。然后,它对结果进行字符串拆分,将其从单个字符串拆分回一个单独的项列表,并将拆分操作的每个结果扩展到一个全局

下面是一个具体的例子:

pids=( 123 456 789 012 )
IFS=02468 # now entering Insanity World!
echo "${pids[@]}"  # still works correctly
echo ${pids[*]}    # not so much
…将作为其两行输出发射,如所示:


…因为IFS中的数字用于分割为单独的回显参数,而不是作为文字数据传递。

不是完全重复的,但解释了$*和$@之间的差异;同样也适用于数组。考虑运行你的代码并遵循它的建议,BTW——它会建议你把$file作为$FE/E。我也倾向于引用pids+=$!使用wait$pid作为最佳实践/偏执,因为不引用扩展会告诉shell在扩展后对其进行额外操作;要求shell对您不希望在其上执行这些操作的字符串拆分和全局展开值没有任何意义。另外,请注意,不带引号的${pids[@]}与${pids[*]}完全相同;您需要添加引号,使其成为${pids[@]},以便有任何区别。
123 456 789 012
1 3  5  7 9  1