我有一个 bash 函数:
println(){echo "$1" "$2" "$3"}
和
export -f println
我想使用 GNU 并行来运行 println。该命令应采用以下数组的输入:
a1=(a b c)
a2=(x y)
a3=(z1 z2)
它应该输出以下内容:
a x a3
a y a3
b x a3
b y a3
c x a3
c y a3
哪个命令可以做到这一点?我期望这样的命令:
parallel ... println ... a1 ... a2 .... a3
谢谢你!
答案1
只需将其放在:::
中间即可:
$ parallel println ::: "${a1[@]}" ::: "${a2[@]}" ::: "${a3[@]}"
a y z1
a x z1
a y z2
a x z2
b x z2
b x z1
b y z2
b y z1
c x z2
c x z1
c y z1
c y z2
无效println(){echo "$1" "$2" "$3"}
,必须是println(){ echo "$1" "$2" "$3"; }
。
答案2
可以申请支撑扩张在 bash 中使用变量IFS
(IFS=,; eval printf %s "{${a1[*]}}\ {${a2[*]}}\ {${a3[*]}}\$'\n'")
a x z1
a x z2
a y z1
a y z2
b x z1
b x z2
b y z1
b y z2
c x z1
c x z2
c y z1
c y z2
(...)
- 我们在子 shell 中执行,以免将值返回给变量IFS
。
或者就像你的例子一样:
(IFS=,; eval printf %s "{${a1[*]}}\ {${a2[*]}}\ a3\$'\n'")
a x a3
a y a3
b x a3
b y a3
c x a3
c y a3