Gnuとbash配列の並列性

Gnuとbash配列の並列性

GNUを使用してrecon-allコマンドを並列に実行してみました。無料サーファー前処理8つのパテントを同時に実行するbashの患者ロール配列があります。

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

IDが単一のコマンドラインに収まる場合:

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

Lucasが提案したその他の事項:

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

値に特殊文字が含まれている場合に予期しないトークン化やその他の副作用を防ぐために、通常は配列置換と変数を引用することを忘れないでください。

関連情報