这个问题在这里已有答案:
就像在标题中一样,我已经宣布了一堆变量和一个函数。当我通过一个函数传递它时,我得到了我所期望的。但是通过并行运行相同的代码并没有...如何修复它?
#!/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 地图:
评论后编辑
看来这个问题的accepted answer是:没有一种很好的方法将数组变量编码到环境中。
哪有点伤心......;)
从问题的评论看,接受的答案是:没有一种很好的方法将数组变量编码到环境中。
就这样... ;)
看起来还有另外一个:Accessing Associative Arrays in GNU Parallel采用相当复杂的方法。但...
经过一些修补(正如Socovi建议特定问题可以有解决方案),看起来对于我的情况来说,足够好的解决方法是在临时文件中“序列化”数组并在函数中反序列化它。
#!/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