如何将关联数组传递给Gnu并行[复制]

问题描述 投票:1回答:1

这个问题在这里已有答案:

就像在标题中一样,我已经宣布了一堆变量和一个函数。当我通过一个函数传递它时,我得到了我所期望的。但是通过并行运行相同的代码并没有...如何修复它?

#!/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是:没有一种很好的方法将数组变量编码到环境中。

哪有点伤心......;)

arrays bash parallel-processing associative-array gnu-parallel
1个回答
1
投票

从问题的评论看,接受的答案是:没有一种很好的方法将数组变量编码到环境中。

就这样... ;)

看起来还有另外一个: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

© www.soinside.com 2019 - 2024. All rights reserved.