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