
저는 현재 bash를 사용하여 여러 서버에 비교 명령을 배포하기 위해 gnu 병렬을 테스트하고 있습니다. 가장 기본적인 기능에서 이 비교 명령은 비교할 두 개의 입력(오라클 데이터베이스 액세스)을 사용하고 -o를 통한 출력 파일 이름이 필요합니다. 프로그램에는 하나 이상의 작업 로드, 저장 또는 직접 업로드가 필요합니다.
compare -o cmp.input1.input2.dat Input1 Input2
이러한 입력 쌍이 수천 개 있고 각 줄에 프로그램에 필요한 출력 파일 이름과 데이터베이스 식별자가 포함되도록 모든 조합이 포함된 파일을 만듭니다.
#test_parallel
-o cmp.input1.input2.dat Input1 Input2
-o cmp.input1.input3.dat Input1 Input3
-o cmp.input2.input3.dat Input2 Input3
[...]
병렬을 사용하여 명령을 실행하지만 비교 명령이 실패합니다.
parallel -a test_parallel "compare {}"
ERROR: No action specified for results (load, save or direct upload)
usage: compare [-u][-o <file>] query target
모드를 사용하면 --dryrun
병렬이 실행됩니다.
compare -o\ cmp.input1.input2.dat\ Input1\ Input2
어떤 이유로 이스케이프된 공백이 비교 프로그램에서 올바르게 처리되지 않는지 이해할 수 없습니다. Bash에서 이 명령을 실행하면 똑같은 오류 메시지 메시지가 나타납니다. -o 플래그 다음에 이스케이프를 제거하면(-o를 병렬 명령으로 이동할 수 있음) "인수가 너무 많습니다" 오류가 발생합니다. 모든 이스케이프를 제거하면 예상대로 명령이 실행됩니다.
명령 호출에서 이스케이프를 인쇄하지 않도록 병렬로 지시할 수 있습니까? 다음과 같이 예상되는 기본 동작이라는 점을 제외하고는 문서에서 아무것도 찾지 못하는 것 같습니다.parallel --shellquote
답변1
GNU Parallel은 입력을 단일 인수로 처리하고 이를 인용하여 다음과 같은 파일 이름을 안전하게 사용할 수 있습니다.
My brother's 12" records costs 30$ each.txt
귀하의 경우 셸에서 인수를 구문 분석하기를 원하므로 공백이 인용 해제됩니다.
parallel -a test_parallel eval compare {}
또는 공간을 분할할 수도 있습니다.
parallel --colsep ' ' -a test_parallel compare {1} {2} {3} {4}
그러나 모두와 전체를 비교하고 싶기 때문에 훨씬 더 우아하게 수행할 수 있습니다.
parallel cmp -o ../out/cmp.{1}.{2} {1} {2} ::: Input* ::: Input*
그러면 모든 입력*을 모든 입력*과 비교합니다. 다음과 같이 --results
디렉토리에 잘 구성된 출력을 얻을 수 있습니다.
parallel --results out/ cmp {1} {2} ::: Input* ::: Input*
cmp InputY InputX
그러나 이미 실행한 후에 실행을 건너뛰려면 cmd InputX InputY
다음과 같이 하면 됩니다.
parallel --results out/ cmp {=1' $arg[1] ge $arg[2] and $job->skip();' =} {2} ::: Input* ::: Input*
편집하다:
버전 20190722에는 기능이 도입되었습니다 uq
.
parallel -a test_parallel compare {=uq=}
uq
펄 함수입니다. 호출되면 GNU Parallel은 해당 대체 문자열을 인용하지 않습니다. 따라서 인용된 문자열과 인용되지 않은 대체 문자열을 혼합할 수 있습니다.
parallel echo {} = {=uq=} ::: \$PWD
# You can change $_ if you want: uq() is a normal perl function
parallel echo {}ME = '{=uq(); $_.="ME"=}' ::: \$HO \$LOGNA