두 개의 명령줄 인수를 사용할 때마다 실행 파일을 여러 번 실행해야 합니다. 나는 이 목적으로 그것을 사용하곤 했지만 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
각 호출마다 xargs
2개의 매개변수가 전달되어야 함 을 의미합니다. 그런 다음 각 숫자는 매개변수로 해석되므로 각 줄은 두 개의 매개변수로 해석됩니다.run
xargs
args.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']
따라서 xargs
Python 스크립트가 별도의(공백으로 구분된) 숫자를 인수로 사용하여 호출 되면 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
도구는 모든 공백 그룹을 개행 문자로 변환합니다.