Как передать ассоциативный массив в Gnu Parallel

Как и в заголовке, я объявил кучу переменных и функцию. И когда я передаю их через функцию, я получаю то, что ожидал. Но запуск того же кода через параллель не помог... Как это исправить?

#!/bin/bash                                                

declare -xA MAP # export associative array                 
declare -x str = "ing" # export variable                     
MAP[bar] = "baz"                                             
MAP[bar2] = "baz2"                                           


foo() {                                                    
  echo "$@"                                                
  echo "variable: ${str}"                                  
  echo "map: ${MAP[@]}"                                    
}                                                          

export -f foo                                              

foo "call function directly:"          

вызвать функцию напрямую:
переменная: ing
карта: baz2 baz

parallel foo ::: "call function through parallel" ::: 1 2 3

функция вызова через параллель 1
переменная: ing
карта:
функция вызова через параллель 2
переменная: ing
карта:
функция вызова через параллель 3
переменная: ing
карта:

редактировать после комментариев

Похоже, что принятый ответ для этого вопроса: На самом деле нет хорошего способа кодировать переменную массива в среду.

Что немного грустно... ;)

Вы не можете экспортировать (ассоциативные) массивы. Однако вы должны иметь возможность передавать значения массива в parallel, который передает их сценарию. Если вы укажете, что именно вы пытаетесь сделать с массивом, мы можем помочь вам в этом.

Socowi 23.03.2019 18:44

Хотел бы я добавить это в качестве ответа: Ответ env_parallel. Вы не можете экспортировать ассоциативные массивы безсписывание — что и делает env_parallel. Я не могу добавить это как ответ на другой вопрос, потому что это относится только к GNU Parallel, а не вообще.

Ole Tange 24.03.2019 20:47

Ответ добавлен stackoverflow.com/a/55327988/363028

Ole Tange 24.03.2019 21:00
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
3
207
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из комментариев под вопросом видно, что принятый ответ: На самом деле нет хорошего способа кодировать переменную массива в среду.

И это все... ;)

Похоже, есть еще один: Доступ к ассоциативным массивам в GNU Parallel с довольно изощренным подходом. Но...

после некоторой возни (поскольку Сокови предположил, что у конкретной проблемы могут быть решения), похоже, что для моего случая достаточно хорошим обходным путем является «сериализация» массива во временном файле и десериализация его в функции.

#!/bin/bash                                                                   

declare -A MAP # export associative array                                    
declare -x str = "ing" # export variable                                        
MAP[bar] = "baz"                                                                
MAP[bar2] = "baz2"                                                              
declare -x serialized_array=$(mktemp)   

# declare -p can be used to dump the definition 
# of a variable as shell code ready to be interpreted                                      
declare -p MAP > "${serialized_array}" 


# perform cleanup after finishing script                                      
cleanup() {                                                                   
  rm "${serialized_array}"                                                    
}                                                                             
trap cleanup EXIT                                                             


foo() {                                                                       
  echo "$@"                                                                   
  echo "variable: ${str}"                                                     
  source "${serialized_array}" # deserialize an array                         
  echo "map: ${MAP[@]}"                                                       
}                                                                             

export -f foo                                                                 

foo "call function directly:"  

вызвать функцию напрямую:
переменная: ing
карта: baz2 baz

parallel foo ::: "call function through parallel" ::: 1 2 3 

функция вызова через параллель 1
переменная: ing
карта: baz2 baz
функция вызова через параллель 2
переменная: ing
карта: baz2 baz
функция вызова через параллель 3
переменная: ing
карта: baz2 baz

Другие вопросы по теме