Dies ist mein Fallszenario:
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 "{#}")
Wie kann ich auf die einzelnen Elemente eines Arrays in GNU Parallel verweisen?
Das ist zwar einfach, aber ich konnte es im Handbuch nicht finden.
Diese Frage wurde gestellt, um zu beantwortendieses andere, aber nachdem ich sie gestellt hatte, kam ich zu dem Schluss, dass es zwei verschiedene Fragen waren.
Antwort1
Obwohl es einfach aussieht, ist es in Wirklichkeit sehr schwer.
Von GNU Parallel gestartete Jobs werden nicht in derselben Shell gestartet, in der GNU Parallel ausgeführt wird. Es sieht also so aus:
bash[1]---perl(running parallel)---bash[2]
$array ist in bash[1] definiert, aber Sie möchten es in bash[2] verwenden. Es ist unmöglich, es vollständig zu tun (d. h. wenn Sie Schreibzugriff auf das Array haben möchten), aber wirdürfenmach einKopierenvon $array verfügbar:
env_parallel 'echo ${array[{}]}' ::: 1 2
env_parallel
(eingeführt in GNU Parallel 20140822) kopiert die gesamte Umgebung von bash[1] nach bash[2] (Ihre Umgebung muss also relativ klein sein), wo sie initiiert wird, bevor der Job ausgeführt wird.
env_parallel
ist ziemlich instabil. Wenn Sie also Fehler finden, melden Sie sie bitte.