답변:
그것을하는 한 가지 방법 :
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
인수 목록이 너무 길면 실행이 중단 됩니다.
mycommand
합니다. 당신은 항상 -x
마지막에 추가 할 수 있습니다 xargs
.
xargs
전혀, 그냥 사용 find
이 사용할 수 있는지. 이 솔루션은 위험합니다. 적어도 당신의 대답에 실패 사례에 대해 경고해야합니다.
find
특히 초기 인수가 파일 이름이 아닌 경우 더 나은 일반적인 솔루션이 어떻게 될지 알지 못합니다. :)
-f
이이고 설명에 사용 된 예제 도구를 ls
사용하면 @ not-a-user가 파일 이름을 처리하고 있습니다. 그리고 명령 줄 을 구성 할 수 find
있는 -exec
인수를 제공하면 좋습니다 . ( 두 번 이상 실행할 수있는 한, 그렇지 않은 경우 여기에 다른 문제가 있습니다 ...)mycommand
xargs
이를 해결하는 더 좋은 방법은 다음과 같습니다.
에서 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 "$@"
for i; do args+=('-f' "$i");done;
mycommand "${args[@]}"
. 이것이 더 빠르지 만 IDK가 배열에 2 개의 요소를 추가하면 O (n)이어야하는 것처럼 보이지만 set
루프는 매번 누적 된 인수 목록을 복사하고 다시 구문 분석 할 것입니다 (O (n ^ 2)).
ARG_MAX
하여-f
분리 될 위험이 있습니다.