parallel介绍
parallel是一个很好用的linux并行软件,与linux自带的xargs功能类似,但比它更好用,关于parallel的安装及具体用法可以参考该文章:15分钟神器gnu parallel 入门观止 ,这里介绍一个使用parallel时需要注意的小坑。
一个小坑
paralle并行的本质是开启了多个进程,也就是多个shell,每个shell单独去执行任务,由parallel来控制这些进程。那么这里就存在一个问题,即父shell定义的变量不会传给parallel开启的子shell,子shell里面这些变量是空的,因此在子shell中使用这些变量的时候就会报错,如果将变量传给bc去计算数值,则会报(standard_in) 2: syntax error,这个报错极其隐晦,让人看不出原因是什么,但真实原因是传给bc的变量是空的,一个简单复现这个报错的例子如下:
$ a=1 $ b= $ echo $b $ echo "$a > $b" | bc (standard_in) 2: syntax error
讯享网
使用parallel时一般都会定义一个函数,这个函数用来处理输入数据,如果用户在函数外面定义了一些函数里面需要使用的变量,那么函数里面是找不到这些变量的,如果将这些变量传给bc去计算,就会报上面的错误,一个示例代码如下:
讯享网max_num=3 function compare_value(){
my_value=$1 compare_result=$(echo "$my_value > $max_num" | bc) # echo $compare_result if [[ $compare_result == 0 ]]; then echo "less than" else echo "greater than" fi } # 普通执行 compare_value 2 compare_value 4 # 输出结果 # less than # greater than # paralle并行执行 export -f compare_value echo -e "2\n4" | parallel -j 2 compare_value {
} # 输出结果 # greater than # (standard_in) 2: syntax error # greater than # (standard_in) 2: syntax error
可以看到使用parallel的时候出现了syntax error错误,并且还输出了greater than,这是因为compare_result 是空的,在if判断的时候就会执行else语句,因此输出了greater than。
在这个例子中,max_num是在脚本中定义的变量,只在当前shell有效,parallel会开启子shell,而子shell中max_num是空的,因此就会报错,解决办法有两个:
- 将变量作为参数传给函数,代码如下
解决办法1 function compare_value(){
my_value=$1 max_num=$2 compare_result=$(echo "$my_value > $max_num" | bc) # echo $compare_result if [[ $compare_result == 0 ]]; then echo "less than" else echo "greater than" fi } export -f compare_value max_num=3 echo -e "2\n4" | parallel -j 2 compare_value {
} $max_num
- 使用
export将变量变成环境变量
讯享网 解决办法2 function compare_value(){
my_value=$1 compare_result=$(echo "$my_value > $max_num" | bc) # echo $compare_result if [[ $compare_result == 0 ]]; then echo "less than" else echo "greater than" fi } export -f compare_value export max_num=3 echo -e "2\n4" | parallel -j 2 compare_value {
}
以上两种方式都可以解决报错,可以根据实际需求选择哪一个。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/21524.html