Как и в заголовке, я объявил кучу переменных и функцию. И когда я передаю их через функцию, я получаю то, что ожидал. Но запуск того же кода через параллель не помог... Как это исправить?
#!/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
карта:
редактировать после комментариев
Похоже, что принятый ответ для этого вопроса: На самом деле нет хорошего способа кодировать переменную массива в среду.
Что немного грустно... ;)
Хотел бы я добавить это в качестве ответа: Ответ env_parallel. Вы не можете экспортировать ассоциативные массивы безсписывание — что и делает env_parallel. Я не могу добавить это как ответ на другой вопрос, потому что это относится только к GNU Parallel, а не вообще.
Ответ добавлен stackoverflow.com/a/55327988/363028



Из комментариев под вопросом видно, что принятый ответ: На самом деле нет хорошего способа кодировать переменную массива в среду.
И это все... ;)
Похоже, есть еще один: Доступ к ассоциативным массивам в 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
Вы не можете экспортировать (ассоциативные) массивы. Однако вы должны иметь возможность передавать значения массива в
parallel, который передает их сценарию. Если вы укажете, что именно вы пытаетесь сделать с массивом, мы можем помочь вам в этом.