인용된 인수의 GNU 병렬 분할 방지

인용된 인수의 GNU 병렬 분할 방지

나는 사용하려고GNU 병렬상수 및 가변 매개변수의 조합을 사용하여 공통을 여러 번 실행합니다. 하지만 어떤 이유에서든 parallel.

이 예에서는 상수 매개변수가 'a b'두 개의 매개변수 대신 단일 매개변수로 전달되어야 합니다.debug-call

$ parallel debug-call 'a b' {} ::: {1..2}
[0] = '[...]/debug-call'
[1] = 'a'
[2] = 'b'
[3] = '1'
[0] = '[...]/debug-call'
[1] = 'a'
[2] = 'b'
[3] = '2'

debug-call간단한 스크립트에 전달된 모든 매개변수를 인쇄합니다 argv. 대신 다음 출력을 보고 싶습니다.

[0] = '[...]/debug-call'
[1] = 'a b'
[2] = '1'
[0] = '[...]/debug-call'
[1] = 'a b'
[2] = '2'

이것은 버그입니까, 아니면 GNU Parallel이 명령줄 인수를 명령에 전달하기 전에 분할하는 것을 방지하는 옵션이 있습니까?

답변1

parallel인수 연결을 구문 분석하기 위해 쉘(호출되는 컨텍스트에 따라 다르지만 일반적으로 쉘에서 호출될 때 동일한 쉘임)을 실행합니다.

그래서:

parallel debug-call 'a b' {} ::: 'a b' c

동일합니까?

parallel 'debug-call a b {}' ::: 'a b' c

parallel알림을 받을 예정:

your-shell -c 'debug-call a b <something>'

<something>(희망적으로) 쉘의 매개변수가 올바르게 인용되었습니다. 예를 들어, 쉘이 이면 bash실행됩니다.

bash -c 'debug-call a b a\ b'

원하는 곳은 다음과 같습니다.

parallel 'debug-call "a b" {}' ::: 'a b' c

또는

parallel -q debug-call 'a b' {} ::: 'a b' c

연결하기 전에 parallel(셸의 올바른(희망적으로) 구문에서) 매개변수를 인용할 위치는 어디입니까 ?

xargs쉘을 먼저 호출하지 않으려면 대신 GNU를 사용할 수 있습니다 .

xargs -n1 -r0 -P4 -a <(printf '%s\0' 'a b' c) debug-call 'a b'

이는 셸(또는 초기화 시 실행되는 명령)을 호출하지 않지만 를 사용한 출력 재정렬과 같은 parallel추가 기능의 이점은 없습니다 .parallel-k

다음에서 다른 방법을 찾을 수 있습니다.백그라운드 병렬 실행

관련 정보