![使用mapfile和parallel创建bash数组时,为什么在函数内部使用时没有创建数组?](https://linux22.com/image/209616/%E4%BD%BF%E7%94%A8mapfile%E5%92%8Cparallel%E5%88%9B%E5%BB%BAbash%E6%95%B0%E7%BB%84%E6%97%B6%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%E5%87%BD%E6%95%B0%E5%86%85%E9%83%A8%E4%BD%BF%E7%94%A8%E6%97%B6%E6%B2%A1%E6%9C%89%E5%88%9B%E5%BB%BA%E6%95%B0%E7%BB%84%EF%BC%9F.png)
当我使用mapfile
withparallel
在函数内创建数组时,该数组未正确创建。
为什么是这样?
数组创建不在函数中
mapfile -t arr < <(parallel -j 0 echo ::: {1..5})
declare -p arr
declare -a arr=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")
同样的事情,但是在函数内部
mapRay() { mapfile -t "$1" < <(parallel -j 0 "$2" ::: "$3"); }
mapRay arr echo {1..2}
declare -p arr
declare -a arr=([0]="1")
答案1
为什么是这样?
$ cat un714227.sh
mapRay(){ mapfile -t "$1" < <(parallel -j 0 "$2" ::: "$3"); }
mapRay arr echo {1..2}
$ bash -x ./un714227.sh
++ mapRay arr echo 1 2
++ mapfile -t arr
+++ parallel -j 0 echo ::: 1
如您所见,mapRay
使用 $1=arr $2=echo $3=1 $4=2 调用,并且仅使用参数parallel -j0 "$2" ::: "$3"
运行,忽略.echo
1
2
该数组正确包含命令的输出parallel
;它是命令的输入parallel
,这显然不是您想要的。
你可能想要"${@:3}"
得到类似的东西全部前 2 个之后的参数。
或者,处理特殊(有时是可选的)然后同质但变化的参数的经典方法是处理特殊参数并将shift
它们取出,然后处理其余的部分:
mapRay(){
local var="$1" cmd="$2"
shift 2
mapfile -t "$var" < <(parallel -j0 "$cmd" ::: "$@")
}
答案2
请看一下parset
(https://www.gnu.org/software/parallel/parset.html)
parset myarray seq 3 ::: 4 5 6
echo "${myarray[1]}"
或者在你的情况下:
parset arr -j0 echo ::: {1..2}
echo "${arr[1]}"
如果每个作业的输出是多行,它也将处理。