mapfileとパラレルを使用してbash配列を作成するときに関数内で使用すると配列が生成されないのはなぜですか?

mapfileとパラレルを使用してbash配列を作成するときに関数内で使用すると配列が生成されないのはなぜですか?

関数内で配列を生成するためにmapfilewithを使用すると、配列は正しく生成されません。parallel

なぜこれですか?

配列生成が機能しない

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"無視して実行されます。echo12

配列にはコマンドの出力が正しく含まれていますparallelparallelこれは明らかに望むものではありません。

"${@:3}"あなたは次のようなものを取得したいかもしれませんみんな最初の2以降のパラメータ。

あるいは、特別な(時にはオプション)引数を処理し、同種ですが、さまざまな引数を処理する古典的な方法は、特別な引数を処理してshiftそれを削除して処理することです。残り:

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

答え2

これを見てくださいparsethttps://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]}"

各ジョブの出力が複数行であっても処理されます。

関連情報