GNU Parallel: 配列要素を参照するにはどうすればいいですか?

GNU Parallel: 配列要素を参照するにはどうすればいいですか?

これが私のケースのシナリオです:

luis@Balanceador:~$ echo ${array[@]}
a b
luis@Balanceador:~$ echo ${array[1]}
a
luis@Balanceador:~$ echo ${array[2]}
b
luis@Balanceador:~$ parallel echo ${array[]} ::: 1 2
-bash: ${array[]}: bad substitution
luis@Balanceador:~$ parallel echo ${array[{}]} ::: 1 2
-bash: {}: syntax error: operand expected (error token is "{}")
luis@Balanceador:~$ parallel echo ${array[{1}]} ::: 1 2
-bash: {1}: syntax error: operand expected (error token is "{1}")
luis@Balanceador:~$ parallel echo ${array[{#}]} ::: 1 2
-bash: {#}: syntax error: operand expected (error token is "{#}")

GNU Parallel で配列の個々の要素を参照するにはどうすればよいですか?

確かにこれは簡単なのですが、マニュアルでは見つけることができませんでした。

この質問は答えるために作成されましたこの他のしかし、質問した後で、これらは2つの異なる質問であると考えました。

答え1

簡単そうに見えますが、実はとても難しいです。

GNU Parallel によって開始されたジョブは、GNU Parallel が実行されるのと同じシェル内では開始されません。つまり、次のようになります。

bash[1]---perl(running parallel)---bash[2]

$arrayはbash[1]で定義されていますが、それをbash[2]で使用したいとします。完全に行うことは不可能です(つまり、配列への書き込みアクセスが必要な場合)。できる作るコピー利用可能な$array:

env_parallel 'echo ${array[{}]}' ::: 1 2

env_parallel(GNU Parallel 20140822で導入)は、bash[1]の環境全体をbash[2]にコピーします(そのため、環境は小さくする必要があります)。ジョブが実行される前に、それが初期化されます。

env_parallelかなり不安定なので、バグを見つけた場合は報告してください。

関連情報