xargs를 통해 여러 매개변수 전달

xargs를 통해 여러 매개변수 전달

xargs명령의 여러 부분에서 여러 매개변수를 실행할 수 있기를 원합니다 .

예를 들어 다음과 같습니다.

echo {1..8} | xargs -n2 | xargs -I v1 -I v2 echo the number v1 comes before v2

다시 돌아오길 바라

the number 1 comes before 2
the number 3 comes before 4 

...등

이것이 가능합니까? 내 다중 사용법이 -I잘못된 것 같습니다 .

답변1

나는 당신이 이런 식으로 할 수 없다고 믿습니다 -I. 그러나 다음과 같이 말하면 원하는 효과/동작을 얻을 수 있습니다.

echo {1..8} | xargs -n2 sh -c 'echo "the number $1 comes before $2"' sh

이는 본질적으로애드 혹입력에서 구문 분석된 두 값을 xargs통해 "스크립트"에 전달되는 셸 스크립트 줄입니다 sh -c. xargs그런 다음 쉘은 이러한 값을 할당하고 $1" $2스크립트"에서 이를 참조할 수 있습니다.

답변2

특정한 경우에는 printf언제든지 다음을 수행할 수 있습니다.

echo {1..8} | xargs printf 'the number %s comes before %s\n'

단일 호출에 필요한 것보다 더 많은 인수가 제공되면 printf여러 번 실행할 수 있는 유사한 고유 기능이 있기 때문입니다. xargs비록 이것보다 낫지만

printf 'the number %s comes before %s\n' {1..8}

큰 목록의 경우 간단한 명령으로 여러 인스턴스가 실행될 xargs수 있으며 , 그 중 일부에는 홀수의 인수가 있을 수 있습니다. 1000이 짝수인 곳에 전달하면 이를 방지 할 수 있으며 도달 하지 못할 만큼 작아야 합니다.xargsprintf-n 1000xargs인수 목록이 너무 깁니다.너무 많은 s를 실행하지 않도록 제한하고 충분히 큽니다 printf.

이는 xargs쉘의 내장을 호출하지 않고 printf외부를 호출 printf하며 각 호출은 별도의 새 프로세스에서 수행됩니다.

printf또한 일부 BSD를 제외하고 빈 입력을 사용하면 인수 없이 한 번만 실행 됩니다 . GNU xargs및 호환 버전에는 이를 방지하기 위한 -r (또는 --no-run-if-empty) 옵션이 있습니다.

명확하게 말하면 이 간단한 대답은 귀하의 printf예에만 해당되며 명령에 두 개의 인수를 한 번에 전달해야 하는 일반적인 경우(예: example diff)에서는 작동하지 않습니다. 일반적인 문제를 해결하려면 다음을 zsh사용할 수 있습니다.

for i j ({1..8}) echo "the number $i comes before $j"

답변3

이 시도:

echo {1..8} |xargs -n 2 bash -c 'echo "the number $0 comes before $1"'

관련 정보