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

배열에는 command 의 출력이 올바르게 포함되어 있습니다 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]}"

각 작업의 출력이 여러 줄인 경우에도 처리됩니다.

관련 정보