xargs - 각 인수에 인수를 추가합니다.

xargs - 각 인수에 인수를 추가합니다.

나는 알고 있다 l="a b c".

echo $l | xargs ls

생산하다

ls a b c

어떤 구조가 생산되는지

mycommand -f a -f b -f c

답변1

한 가지 방법은 다음과 같습니다.

echo "a b c" | xargs printf -- '-f %s\n' | xargs mycommand

이는 a, 및 에 공백, 개행, 따옴표 또는 백슬래시가 포함되어 b있지 않다고 가정합니다. c:)

GNU를 사용하면 findutil일반적인 경우를 처리할 수 있지만 좀 더 복잡합니다.

echo -n "a|b|c" | tr \| \\0 | xargs -0 printf -- '-f\0%s\0' | xargs -0 mycommand

구분 기호를 |, 또는 에 표시되지 않는 다른 문자로 바꿀 수 있습니다.abc

편집하다:~처럼@michaelmore인수 목록이 길면 에 전달할 수 있는 최대 인수 길이를 초과할 위험이 있습니다 mycommand. 이런 일이 발생하면 마지막 항목이 xargs목록을 분할하고 다른 복사본을 실행하며 mycommand하나가 종료되지 않은 상태로 남을 위험이 있습니다 -f. 이것이 걱정된다면 xargs -0위의 마지막 항목을 다음과 같이 바꿀 수 있습니다.

... | xargs -x -0 mycommand

이렇게 해도 문제가 해결되지는 않지만 mycommand인수 목록이 너무 길어지면 실행이 중단됩니다.

답변2

이 문제(IMO)를 해결하는 더 좋은 방법은 다음과 같습니다.

  • 존재하다 zsh:

    l=(a b c)
    mycommand -f$^l
    

    또는 매개변수가 옵션에 추가되지 않도록 배열 압축을 사용하십시오.

    l=(a b c) o=(-f)
    mycommand "${o:^^l}"
    

    이렇게 하면 l배열에 빈 요소나 공백 또는 기타 문제가 있는 문자가 포함된 요소가 포함된 경우에도 여전히 작동합니다 xargs. 예:

    $ l=(a '' '"' 'x y' c) o=(-f)
    $ printf '<%s>\n' "${o:^^l}"
    <-f>
    <a>
    <-f>
    <>
    <-f>
    <">
    <-f>
    <x y>
    <-f>
    <c>
    
  • 존재하다 rc:

    l=(a b c)
    mycommand -f$l
    
  • 존재하다 fish:

    set l a b c
    mycommand -f$l
    

(AFAIK rcfish배열 압축 없음)

Bourne's와 같은 구식 쉘을 사용하면 bash언제든지 이 작업을 수행할 수 있습니다(여전히 배열 요소에 문자를 허용함 $@).

set -- a b c
for i do set -- "$@" -f "$i"; shift; done
mycommand "$@"

답변3

매개변수 앞에 접두사를 붙이는 가장 쉬운 방법은 매개변수를 다음 printf과 같이 사용하는 것입니다.명령 대체:

l="a b c"

mycommand $(printf ' -f %s' $l)

$()또는 파이프를 통해 명령 대체를 다시 작성할 수 있습니다 xargs.

printf ' -f %s' $l | xargs mycommand

명령 대체를 사용하면 매개변수 목록에서 동적 매개변수의 위치를 ​​제어할 수 있습니다. 예를 들어, 전달하려는 다른 고정 매개변수 사이에 매개변수를 추가하거나 배치할 수도 있습니다 mycommand.

xargs방법은 매개변수를 끝에 추가하는 데 가장 적합하지만 고정 매개변수 사이에 동적 매개변수의 다양한 배치를 처리하려면 더 모호한 구문이 필요합니다.

답변4

접두사 -f:

echo 'a b c' | xargs -n 1 echo -e -f | xargs mycommand

-e 매개변수는 -f가 다른 매개변수로 해석되는 것을 방지하기 위한 것입니다.

다음과 같은 출력을 원하는 경우(a, b 및 c는 모두 -f와 a -g 사이에 있음):

mycommand -f a -g -f b -g -f c -g

그러면 명령은 다음과 같습니다.

echo 'a b c' | tr ' ' '\n' | xargs -I @ echo -e -f @ -g | xargs mycommand

관련 정보