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

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間違っているようです。

答え1

私はあなたがこのようにすることはできないと思います-I。ただし、次のように言うと、目的の効果/動作が得られます。

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

これは本質的にアドホック入力から解析された2つの値を介してxargs「スクリプト」に渡されるシェルスクリプトの行sh -cxargsその後、シェルはこれらの値を割り当て、$1$2スクリプト」でそれを参照できます。

答え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、その一部には奇数の引数があります。 1000が偶数の場所に渡されると、これを防ぐことができ、到達できないほど小さくなければなりません。xargsprintf-n 1000xargs引数のリストが長すぎます。あまりにも多くのsを実行しないように制限し、十分に大きいですprintf

これはxargsシェルの組み込みを呼び出さずにprintf外部を呼び出し、printf各呼び出しは別々の新しいプロセスで実行されます。

printfまた、一部のBSDを除いて空の入力を使用すると、引数なしで一度だけ実行されます。 GNUxargsおよび互換バージョンにはこれを防ぐための-r (または--no-run-if-empty)オプションがあります。

明確に言えば、この簡単な答えはあなたのprintf例にのみ当てはまり、コマンドに2つの引数を一度に渡す必要がある一般的なケース(例:例diff)では機能しません。一般的な問題を解決するには、次のものをzsh使用できます。

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

答え3

この試み:

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

関連情報