xargs-各引数にパラメーターを追加します


回答:


12

それを行う1つの方法:

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

これは想定してab、およびc空白、改行、引用符やバックスラッシュが含まれていません。:)

GNU findutilを使用すると、一般的なケースを処理できますが、少し複雑です。

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

あなたは置き換えることができます|に表示されていないいくつかの他の文字で区切りをabまたはc

編集:として@MichaelMolのノートに渡すことができる引数の最大長をオーバーフローの危険性がある引数の非常に長いリストを持ちますmycommand。それが起こると、最後のものxargsがリストを分割し、の別のコピーを実行しますmycommand。そして、それが終了しないままになるリスクがあり-fます。その状況が心配な場合は、xargs -0上記の最後を次のように置き換えることができます。

... | xargs -x -0 mycommand

これは問題を解決しませんがmycommand、引数のリストが長くなりすぎると実行を中止します。


1
ペアのパラメーターを超えARG_MAX-f分離するという非常にofいリスクがあります。
マイケルモール

@MichaelMolこれは良い点ですが、について詳しく知らなくてもその状況を処理する意味のある方法はないと思いますmycommand。いつでも-x最後に追加できxargsます。
桂佐藤

適切な解決策はおそらくまったく使用せず、使用できる場合にxargs使用findすることだと思います。この解決策は危険です。あなたは少なくともあなたの答えの失敗事例について警告するべきです。
マイケルモール

@MichaelMol find特に初期引数がファイル名でない場合、私はどのように一般的な解決策が良いかわかりません。:)

初期引数が何であるかはわかりません。提示された例のみが表示され、質問を引き起こしたシナリオは表示されません。直観は、という名前の引数と-fls説明に使用するサンプルツールを使用して、@ not-a-userがファイル名を処理していることを示唆しています。そして、コマンドラインを構築することができる引数をfind提供する-execと、それは問題ありません。(複数回実行することが許可されている限り。そうでない場合、ここでの使用には別の問題があります...)mycommandxargs
マイケルモール

5

それに対処するより良い方法(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 "$@"

1
bashでそれを行う別の方法は、名前付き配列変数を使用することです。 for i; do args+=('-f' "$i");done; mycommand "${args[@]}"。IDKはこれが高速ですが、配列に2つの要素を追加するとO(n)になるはずですが、setループはおそらく蓄積されたargリストを毎回コピーして再解析します(O(n ^ 2))。
ピーターコーデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.