Como posso usar o GNU Parallel para atribuir valores a variáveis?

1

Estou tentando atribuir valores a variáveis usando Paralelo GNU :

$ parallel --dry-run --xapply a{1}={2} ::: a b c ::: 5 6 7
aa=5
ab=6
ac=7

Mas a execução parece não estar funcionando OK:

$ parallel --xapply a{1}={2} ::: a b c ::: 5 6 7
$ echo $aa

$ echo $ab

$ echo $ac

Valores vazios em todos os casos.

O que está acontecendo e como eu poderia atribuir um valor a uma variável usando o GNU Parallel?

Mais dados:

  • Eu sei que existem maneiras de tornar o GNU Parallel herdar as variáveis de seu processo pai, mas, nesse caso, o que eu quero é o contrário.
por Sopalajo de Arrierez 25.02.2018 / 22:41

2 respostas

2

Você não pode definir variáveis no shell de fora do shell (inclusive de um processo iniciado pelo shell); veja por exemplo É possível passar variáveis de ambiente de filho para pai no espaço do usuário?

Eu duvido que seria bom usar parallel para isso, não é como se definir uma variável levasse muito tempo ...

    
por 26.02.2018 / 07:15
2

Como Stephen Kitt escreve, é impossível passar valores de filho para pai - ou seja, você não pode fazer isso sem trapacear .

Felizmente para você, versões mais recentes do GNU Parallel incluem um truque chamado parset . parset é uma função de shell que você precisa ativar primeiro.

$ . 'which env_parallel.bash' # Replace bash with zsh, ksh, ash, dash, sh as needed
$ parset a,b,c echo ::: 5 6 7
$ echo $a
5

Se o shell suportar matrizes:

$ parset arr echo ::: 5 6 7
$ echo ${arr[1]}
5 (in zsh) 6 (otherwise)

Como Stephen Kitt indica isso é muito mais lento do que simplesmente atribuir o valor numérico. Mas eu entendo que o seu exemplo é apenas um MCVE, então a situação real será muito mais complexa e, portanto, pode ser necessária a execução em paralelo.

    
por 26.02.2018 / 09:14