Paralelo GNU: Como posso referenciar elementos de array?

2

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 alguns vetores no GNU Parallel?

Claro que é fácil, mas não consegui encontrá-lo no manual.

Esta pergunta foi feita para responder este outro , mas, depois de perguntar, eu considerei que eram duas questões diferentes.

    
por Sopalajo de Arrierez 27.06.2016 / 00:06

1 resposta

2

Embora pareça fácil, é realmente muito difícil.

Jobs iniciados pelo GNU Parallel não são iniciados dentro do mesmo shell do GNU Parallel. Então parece com isso:

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

$ array é definido no bash [1], mas você quer usá-lo no bash [2]. É impossível fazer completamente (ou seja, se você quiser acesso de escrita ao array), mas nós podemos fazer uma cópia de $ array disponível:

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

env_parallel (introduzido no GNU Parallel 20140822) copia todo o ambiente do bash [1] to bash [2] (então o seu ambiente tem que ser meio pequeno) onde é iniciado antes do job ser executado.

env_parallel é bastante instável, por isso, se encontrar erros, denuncie-os.

    
por 27.06.2016 / 11:49