gnu 병렬 명령에서 공백 문자 전에 이스케이프 제거

gnu 병렬 명령에서 공백 문자 전에 이스케이프 제거

저는 현재 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

관련 정보