web-dev-qa-db-ja.com

xargsを介して複数のパラメーターを渡す

xargsを使用して、コマンドのさまざまな部分で複数のパラメーターを実行できるようにしたいと思います。

たとえば、次のとおりです。

echo {1..8} | xargs -n2 | xargs -I v1 -I v2 echo the number v1 comes before v2

それが戻ることを願っています

the number 1 comes before 2
the number 3 comes before 4 

...など

これは達成可能ですか? -Iの複数回の使用が正しくないと思われます。

15
Damien Sawyer

-Iはそのようには使用できないと思います。ただし、次のように言って、必要な効果the /動作を得ることができます。

echo {1..8} | xargs -n2 sh -c 'echo "the number $1 comes before $2"' sh

基本的に、これはアドホック 1行のシェルスクリプトを作成し、xargssh -cを介して実行します。 xargsが入力から解析する2つの値は、この「スクリプト」に渡されます。次に、シェルはそれらの値を$1および$2に割り当てます。これらは、「スクリプト」で参照できます。

26
Scott

printfの特定のケースでは、いつでも次のことができます。

echo {1..8} | xargs printf 'the number %s comes before %s\n'

printfには、単一の呼び出しに必要な数よりも多くの引数が与えられた場合に、複数回実行するxargsに似た機能が備わっているためです。それはほとんど利点がありませんが

printf 'the number %s comes before %s\n' {1..8}

また、大きなリストの場合、単純なxargsコマンドを実行すると、xargsprintfのインスタンスをいくつか実行する可能性があり、その一部には奇数の引数がある場合があります。 -n 1000 to xargsこれを防ぐために、1000はarg list too long制限に達しないように十分小さく、実行を回避するのに十分な大きさの偶数です多くのprintfs。

xargsは、シェルの組み込みprintfではなく、外部printfを呼び出し、それぞれの呼び出しは個別の新しいプロセスであることに注意してください。

空の入力の場合、一部のBSDを除いて、引数なしでprintfを1回実行することにも注意してください。 GNU xargsおよび互換性のある-r(または--no-run-if-empty)オプションでそれを回避します。

明確にするために、この単純な答えはprintfの例に固有であり、コマンドに2つのパラメーターを一度に渡す必要がある一般的なケースでは機能しません(diff、 例えば)。 zshの一般的な問題を解決するには、以下を使用できます。

for i j ({1..8}) echo the number $i comes before $j
4

これを試して:

echo {1..8} |xargs -n 2 bash -c 'echo "the number $0 comes before $1"'
2
md11235