질문
Bash에서는 데이터를 단계별로 파이프할 수 있습니다.
program1 | program2 | program3 | ...
또는 변수를 사용하여 이를 수행할 수 있습니다(각 프로그램 작동 방식에 따라 다름).
RES1=$(program1)
RES2=$(program2 $RES1)
...
나는 이 전달되는 데이터에 대한 대응물을 병렬적으로 찾고 있다.
예
"선형" 스크립트를 놀라운 병렬 스크립트로 변환하려고 합니다(이 도구는 여전히 놀라운 일입니다 :-D). 하지만 첫 번째 단계의 출력을 읽고 사용하는 데 문제가 있습니다. 원본:
for fn in $(ls $REV *)
do
DATA=$(sh script1.sh ${fn})
sh script2.sh $DATA
done
다음을 사용하여 수행하는 방법은 다음과 같습니다 parallel
.
ls $REV * | parallel -j+0 DATA=$(sh script1.sh {}) \; sh script2.sh $DATA
그러나 이 코드를 사용하면 myscript
입력 시 일부 데이터가 손상됩니다. 읽기 결과가 있고 두 번째 단계가 제거된 버전은 정상적으로 작동합니다.
ls $REV * | parallel -j+0 sh script1.sh {}
그렇다면 첫 번째 단계의 출력을 어떻게 읽고 parallel
다음 단계에서 사용합니까?
질문
디버깅을 더 쉽게 하기 위해 첫 번째 스크립트(script1.sh)가 다음과 같다고 가정해 보겠습니다.
echo "RECEIVED THIS ${1}"
주요 스크립트는 다음과 같습니다:
ls * | parallel -j+0 RES="$(sh script1.sh {})"
(여기서는 script1의 출력 캡처를 테스트하기 위해 script2를 건너뛰었습니다). 그러면 전체 실행 결과는 다음과 같습니다.
/bin/bash: THIS: command not found
/bin/bash: THIS: command not found
/bin/bash: THIS: command not found
...