이는 예상대로 작동합니다.
$ echo a b c | xargs --replace="{}" echo x "{}" y
x a b c y
이것은 또한 작동합니다:
$ echo a b c | xargs --max-args=1 echo x
x a
x b
x c
그러나 예상대로 작동하지 않습니다.
$ echo a b c | xargs --max-args=1 --replace="{}" echo x "{}" y
x a b c y
이것도 아니다:
$ echo a b c | xargs --delimiter=' ' --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c
y
나는 다음과 같은 결과를 기대합니다.
x a y
x b y
x c y
해결 방법으로 printf와 두 개의 xargs를 사용했지만 이는 추악합니다.
$ echo a b c | xargs printf '%s\0' | \
> xargs --null --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c y
왜 이런 일이 발생하는지 아시나요?
답변1
~에 따르면POSIX 문서, xargs
공백이나 개행으로 구분된 인수를 사용하여 지정된 유틸리티를 실행해야 하며, 이는 처음 두 예제에서 발생합니다.
그러나 --replace
(or)를 사용하는 경우 개행 문자만 인수를 구분합니다. 해결책은 매개변수를 별도의 줄에 제공하는 것입니다 -I
.xargs
$ printf '%s\n' a b c | xargs --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c y
POSIX 옵션을 사용하십시오.
printf '%s\n' a b c | xargs -n 1 -I "{}" echo x "{}" y
여기에는 xargs
한 줄이 아니라 세 줄이 있습니다. (최대) 한 줄을 취하고 해당 줄을 인수로 사용하여 유틸리티를 실행합니다.
또한 대체 횟수에 따라 사용되는 인수 수가 결정되므로 위의 -n 1
(또는 )은 필요하지 않습니다.--max-args=1
-I
$ printf '%s\n' a b c | xargs -I "{}" echo x "{}" y
x a y
x b y
x c y
실제로 POSIX 사양의 이론적 근거 섹션에서는 다음과 같이 xargs
말합니다(필자의 강조).
-I
및-L
옵션은-n
상호 배타적입니다.. 명령줄에 여러 개가 제공되면 일부 구현에서는 지정된 마지막 옵션을 사용하고 다른 구현에서는 옵션 조합을 다르게 처리합니다.
테스트하는 동안 다음과 함께 사용되는 경우 OpenBSD 버전을 확인했습니다 xargs
.-n
-I
$ echo a b c | xargs -n 1 -I "{}" echo x "{}" y
x a y
x b y
x c y
xargs
이는 GNU coreutils가 수행하는 작업(생성 ) 과 다릅니다 x a b c y
. 이는 구현 시 공백 이 사용되었음에도 -n
불구하고 매개변수 구분 기호로 허용 되기 때문입니다 . 따라서 및 를 함께 사용 -I
하지 마십시오 (어쨌든 필요하지 않음).-I
-n
답변2
--max-args
--replace
내가 찾은 한 가지 해결 방법은 다음과 같이 출력을 공급하는 것입니다 .
echo a b c | xargs -n 1 | xargs -i echo firstPart {} secondPart
이렇게 출력됩니다.
firstPart a secondPart
firstPart b secondPart
firstPart b secondPart
나는 기본적으로 입력을 반복 --max-args
하고 기본적으로 개행 문자를 추가한다고 생각합니다.