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이 짝수인 곳에 전달하면 이를 방지 할 수 있으며 도달 하지 못할 만큼 작아야 합니다.xargs
printf
-n 1000
xargs
인수 목록이 너무 깁니다.너무 많은 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"'