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?

Конечно, это просто, но я не смог найти этого в руководстве.

Этот вопрос был создан, чтобы ответитьэтот другой, но, задав его, я понял, что это два разных вопроса.

решение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довольно нестабильна, поэтому если вы обнаружите ошибки, пожалуйста, сообщите о них.

Связанный контент