Este é o meu cenário:
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 "{#}")
Como posso referenciar os elementos individuais de algum array no GNU Parallel?
Claro que é fácil, mas não consegui encontrá-lo no manual.
Esta pergunta foi feita para respondereste outro, mas, depois de perguntar, considerei que eram duas perguntas diferentes.
Responder1
Embora pareça fácil, é realmente muito difícil.
Os trabalhos iniciados pelo GNU Parallel não são iniciados dentro do mesmo shell a partir do qual o GNU Parallel é executado. Então é assim:
bash[1]---perl(running parallel)---bash[2]
$array é definido em bash[1] mas você deseja usá-lo em bash[2]. É impossível fazer isso completamente (ou seja, se você quiser acesso de gravação ao array), mas nóspodefaça umcópia dede $ array disponível:
env_parallel 'echo ${array[{}]}' ::: 1 2
env_parallel
(introduzido no GNU Parallel 20140822) copia todo o ambiente do bash[1] para o bash[2] (então seu ambiente deve ser bem pequeno) onde é iniciado antes da execução do trabalho.
env_parallel
é bastante instável, então se você encontrar bugs, por favor reporte-os.