나는 주어진 알고 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
, b
및 c
공백, 줄 바꿈, 따옴표 또는 백 슬래시를 포함하지 않습니다. 🙂
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는 rc
및 fish
더 배열을 압축 없다)
와 같은 구식 Bourne과 같은 쉘을 사용 bash
하면 항상 할 수 있습니다 (여전히 $@
배열 요소에 문자를 허용 ).
set -- a b c
for i do set -- "$@" -f "$i"; shift; done
mycommand "$@"