gnu 与 bash 数组并行

gnu 与 bash 数组并行

我尝试使用 GNU 并行运行命令 recon-all自由冲浪者预进程我有一个 bash 患者列表数组,可以同时运行 8 项专利:

root@4d8896dfec6c:/tmp# echo ${ids[@]}
G001 G002 G003 G004 G005 G006 G007 G008

并尝试使用命令运行:

echo ${ids[@]} | parallel --jobs 28 recon-all -s {.} -all -qcache

它不起作用,因为我想我需要在 ls 表示中使用 bash 数组,例如:

ls ${ids[@]} | parallel --jobs 28 recon-all -s {.} -all -qcache

我怎样才能做到这一点?

答案1

如果 ids 适合单个命令行:

parallel --jobs 28 recon-all -s {.} -all -qcache ::: "${ids[@]}"

其他如卢卡斯建议:

printf %s\\n "${ids[@]}" | parallel --jobs 28 recon-all -s {.} -all -qcache

答案2

问题是parallel希望输入用换行符分隔,但当您使用echo它时却用空格分隔。为了打印一些由换行符分隔的单词,您可以尝试其中之一

echo one two three | tr ' ' '\n'    # in case your input can not be controlled by you
printf '%s\n' one two three         # if you can control the words eg if you have an array

所以你可能应该这样做:

printf '%s\n' "${ids[@]}" | parallel --jobs 28 recon-all -s {.} -all -qcache

请记住一般引用数组替换和变量,以防止意外的分词和其他副作用(如果您的值包含特殊字符)。

相关内容