使用mapfile和parallel创建bash数组时,为什么在函数内部使用时没有创建数组?

Nic*_*ine 4 bash

当我使用mapfilewithparallel在函数内创建数组时,该数组未正确创建。

为什么是这样?

数组创建不在函数中

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")
Run Code Online (Sandbox Code Playgroud)

同样的事情,但是在函数内部

mapRay() { mapfile -t "$1" < <(parallel -j 0 "$2" ::: "$3"); }

mapRay arr echo {1..2}

declare -p arr
declare -a arr=([0]="1")
Run Code Online (Sandbox Code Playgroud)

dav*_*085 8

为什么是这样?

$ 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
Run Code Online (Sandbox Code Playgroud)

如您所见,mapRay使用 $1=arr $2=echo $3=1 $4=2 调用,并且仅使用参数parallel -j0 "$2" ::: "$3"运行,忽略.echo12

该数组正确包含命令的输出parallel;它是命令的输入parallel,这显然不是您想要的。

您可能想要类似"${@:3}"获取前 2 个参数之后的所有参数。

或者,处理特殊(有时是可选的)然后同质但变化的参数的经典方法是处理特殊参数并将shift它们排除,然后处理其余的

mapRay(){
  local var="$1" cmd="$2"
  shift 2
  mapfile -t "$var" < <(parallel -j0 "$cmd" ::: "$@")
}
Run Code Online (Sandbox Code Playgroud)