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
の複数回の使用が正しくないと思われます。
-I
はそのようには使用できないと思います。ただし、次のように言って、必要な効果the /動作を得ることができます。
echo {1..8} | xargs -n2 sh -c 'echo "the number $1 comes before $2"' sh
基本的に、これはアドホック 1行のシェルスクリプトを作成し、xargs
はsh -c
を介して実行します。 xargs
が入力から解析する2つの値は、この「スクリプト」に渡されます。次に、シェルはそれらの値を$1
および$2
に割り当てます。これらは、「スクリプト」で参照できます。
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
コマンドを実行すると、xargs
がprintf
のインスタンスをいくつか実行する可能性があり、その一部には奇数の引数がある場合があります。 -n 1000
to xargs
これを防ぐために、1000はarg list too long制限に達しないように十分小さく、実行を回避するのに十分な大きさの偶数です多くのprintf
s。
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
これを試して:
echo {1..8} |xargs -n 2 bash -c 'echo "the number $0 comes before $1"'