GNU 병렬 처리에서 변수를 입력으로 사용

GNU 병렬 처리에서 변수를 입력으로 사용

GNU 병렬 방식으로 인수를 전달하는 동안 변수를 입력으로 사용하고 싶습니다. 예를 들어, 세 개의 bash 스크립트가 있고 GNU Parallel을 사용하여 병렬로 실행하고 싶습니다.

"par1.sh", "par2.sh", "par3.sh". 내 스크립트는 다음과 같습니다

Filecount=$(grep -c "if" $1)

echo $Filecount

parallel -j0 sh ::: par$(seq 1 $Filecount).sh

mkdir $2
mv par$(seq 1 $Filecount).sh ./$2

이 코드를 실행하기 위해 가능한 모든 것을 시도했지만 작동하지 않습니다. 그래서 제 질문은 GNU 병렬 처리에 변수를 제공하는 방법입니다. 나는 또한 이것을 시도했습니다 :

par{1..$Filecount}.sh

하지만 그것도 작동하지 않습니다. "seq"도 시도했습니다.

답변1

문제는 병렬성이 아니라 전달하는 "변수"에 있습니다. 이는 par$(seq 1 $Filecount).sh(가설적으로) 다음과 같이 확장됩니다 Filecount=10.

$ echo par$(seq 1 $Filecount).sh
par1 2 3 4 5 6 7 8 9 10.sh

중괄호 확장처럼 작동하기를 원합니다.

$ echo par{1..10}.sh
par1.sh par2.sh par3.sh par4.sh par5.sh par6.sh par7.sh par8.sh par9.sh par10.sh

그러나 변수는 중괄호 확장 내에서 확장되지 않습니다.

$ echo par{1..$Filecount}.sh
par{1..10}.sh

좋은 소식은 이 중 어느 것도 실제로 필요하지 않다는 것입니다. 다음 중 하나를 수행할 수 있습니다.

  1. 일반 글로브 사용

    parallel -j0 sh ::: par*sh
    

    아마도

    parallel -j0 sh ::: par[0-9]*.sh
    
  2. 사전 빌드 변수

    targets=""; for ((num=1;num<=$Filecount;num++)); do targets="$targets par$num.sh"; done
    parallel -j0 sh ::: $targets
    

따라서 두 번째 접근 방식을 사용하면 스크립트는 다음과 같습니다(임의의 파일 이름에 대해 안전하도록 약간 수정되었으며 귀하의 경우에는 관련이 없지만 향후 방문자에게는 적합할 수 있음).

Filecount=$(grep -c "if" "$1")

echo "$Filecount"

targets=( "par1.sh" ); 
for ((num=2;num<=$Filecount;num++)); do 
    targets=("${targets[@]}" par"$num".sh); 
done
parallel -j0 sh ::: "${targets[@]}"

mkdir "$2"
mv "${targets[@]}" ./"$2"

답변2

mkdir $2
seq $Filecount | parallel -j0 sh par{}.sh';' mv par{}.sh ./$2

관련 정보