如何将两个数组的对应元素传入parallel命令的:::参数并行执行
问题根源
- GNU Parallel 默认对多个
:::传入的参数列表执行笛卡尔积运算,即所有排列组合都会触发一次命令执行,你这里两个数组各有4个元素,4*4自然得到16次执行结果。 - 脚本中第二个数组的展开写法存在语法错误:
${arr_2{@}}的大括号顺序错误,正确的数组展开写法为${arr_2[@]}。
修复方案
添加--link参数即可实现同位置参数配对执行,该参数会指定Parallel按位置匹配多个输入源的元素,第1个输入源的第N个元素对应第2个输入源的第N个元素,刚好匹配你预期的4组配对输出。
修复后的完整脚本如下:
arr_1=(a.log b.log c.log d.log) arr_2=(a.json b.json c.json d.json) parallel --halt 2 --link echo "{1} {2}" ::: "${arr_1[@]}" ::: "${arr_2[@]}"
如果使用的是旧版本GNU Parallel不支持--link参数,可以替换为它的别名--xapply,效果完全一致。
内容的提问来源于stack exchange,提问作者patl
相关产品推荐
相关产品推荐

