xargs와 GNU 병렬성의 차이점

xargs와 GNU 병렬성의 차이점

두 개의 명령줄 인수를 사용할 때마다 실행 파일을 여러 번 실행해야 합니다. 나는 이 목적으로 그것을 사용하곤 했지만 xargs최근에 GNU가 존재하고 원칙적으로 그것이 더 나은 도구인 것 같다는 것을 깨달았습니다 parallel(더 많은 기능, 더 최신, 더 광범위한 문서 등).

또한 나에게 있어 강력한 판매 포인트는 "대체"로 사용할 수 있다는 주장입니다 xargs(https://www.gnu.org/software/parallel/history.html). 그러나 이 마지막 점에 대해 몇 가지 문제가 있습니다.

args.txt여러 줄로 구성된 텍스트 파일이 있다고 가정해 보겠습니다 . 각 줄에는 공백으로 구분된 두 개의 숫자가 포함되어 있습니다. 예를 들면 다음과 같습니다.

1 2
7 9
11 13

run각 라인에 대해 한 번씩(즉, 각 매개변수 쌍에 대해 한 번씩) 프로그램을 실행하고 싶습니다 . 그리고 xargs내가 할게

cat args.txt | xargs -n2 run

이는 -n2각 호출마다 xargs2개의 매개변수가 전달되어야 함 을 의미합니다. 그런 다음 각 숫자는 매개변수로 해석되므로 각 줄은 두 개의 매개변수로 해석됩니다.runxargsargs.txt

그러나 위 상황에 대한 드롭인 대체품으로 사용하려고 하면 parallel다른 동작이 발생합니다.xargs

이를 설명하기 위해 프로그램 대신 다음과 같은 작은 Python 스크립트를 사용하여 실행하겠습니다.

프린터.py:

import sys
print([x for x in sys.argv[1:]])

이제 xargs를 사용하면 다음과 같은 결과를 얻을 수 있습니다.

> cat args.txt | xargs -n2 python printer.py

['1', '2']
['7', '9']
['11', '13']

parallel내가 얻을 때

> cat args.txt | parallel -n2 python printer.py

['1 2', '7 9']
['11 13']

따라서 xargsPython 스크립트가 별도의(공백으로 구분된) 숫자를 인수로 사용하여 호출 되면 parallel각 줄은 단일 인수로 해석됩니다. 즉, 예를 들어 첫 번째 호출에서 첫 번째 인수 "1 2""1".

parallel에 대한 직접적인 대체가 될 것으로 기대했기 때문에 이에 대해 약간 혼란스럽습니다 xargs. 그러나 분명히 그것보다 더 미묘합니다. 내 질문은 parallel내가 하고 있는 것과 동일한 일을 달성하기 위해 어떻게 사용해야 하는가인 것 같지만 xargs여기서 동작에 차이가 있는 이유와 의도적인 것인지도 궁금합니다.

답변1

xargs와 사이의 몇 가지 비호환성 중 하나가 발생하고 있으며 parallel이는 의도적으로 설계된 것입니다.

GNU Parallel은 입력이 단일 인수로 인용되도록 보장하지만 xargs는 그렇지 않습니다. 이는 GNU Parallel의 첫 번째 버전을 작성하는 원동력 중 하나였습니다.

$ echo '9" nails in 10" boxes' | xargs echo
9 nails in 10 boxes
$ echo '9" nails in 10" boxes' | parallel echo
9" nails in 10" boxes

그러나 GNU Parallel이 입력을 인용하지 않도록 강제할 수 있습니다.

cat args.txt | parallel python printer.py {=uq=}

이는 명령에서 한 줄을 가져와 args.txt인용 없이 명령에 삽입합니다.

(버전 20190722 이상).

또 다른 옵션은 주석에서 언급한 대로 열을 개별 공간으로 분할하는 것입니다.

cat args.txt | parallel --colsep ' ' python printer.py

또는 공백:

cat args.txt | parallel --colsep '\s+' python printer.py

(버전 20100822 이상).

답변2

병렬은 단어를 읽는 xargs와 달리 입력을 한 번에 한 줄씩 읽습니다.

다음과 같이 동일한 결과를 얻을 수 있습니다.

> sed 's/\s\+/\n/g' args.txt | parallel -n2 python printer.py

여기서 sed도구는 모든 공백 그룹을 개행 문자로 변환합니다.

관련 정보