xargs --max-args --replace를 기본 구분 기호로 사용할 때 발생하는 문제

xargs --max-args --replace를 기본 구분 기호로 사용할 때 발생하는 문제

이는 예상대로 작동합니다.

$ 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하고 기본적으로 개행 문자를 추가한다고 생각합니다.

관련 정보