xargs-각 인수를 매개 변수로 추가 $l | xargs ls 수확량 ls a b

나는 주어진 알고 l="a b c",

echo $l | xargs ls

수확량

ls a b c

어느 구성 수확량

mycommand -f a -f b -f c


답변

그것을하는 한 가지 방법 :

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

이것은 가정 a, bc공백, 줄 바꿈, 따옴표 또는 백 슬래시를 포함하지 않습니다. 🙂

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

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

당신은 대체 할 수있는 |그에서 표시되지 않습니다, 다른 문자로 구분 a, b또는 c.

편집 : @MichaelMol이 지적한 것처럼 인수 목록이 너무 길면 전달할 수있는 최대 인수 길이가 넘칠 위험이 있습니다 mycommand. 이 경우 마지막 xargs은 목록을 분할하고의 다른 사본을 실행 mycommand하며 종료되지 않은 채로 남겨질 위험이 있습니다 -f. 그 상황에 대해 걱정한다면 마지막 xargs -0으로 다음과 같이 바꿀 수 있습니다 .

... | xargs -x -0 mycommand

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


답변

이를 해결하는 더 좋은 방법은 다음과 같습니다.

  • 에서 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과 같은 쉘을 사용 bash하면 항상 할 수 있습니다 (여전히 $@배열 요소에 문자를 허용 ).

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