回答:
それを行う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
あなたは置き換えることができます|
に表示されていないいくつかの他の文字で区切りを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
それに対処するより良い方法(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
(私の知る限り、配列の圧縮は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
ループはおそらく蓄積されたargリストを毎回コピーして再解析します(O(n ^ 2))。
ARG_MAX
て-f
分離するという非常にofいリスクがあります。