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 -c
。xargs
その後、シェルはこれらの値を割り当て、$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が偶数の場所に渡されると、これを防ぐことができ、到達できないほど小さくなければなりません。xargs
printf
-n 1000
xargs
引数のリストが長すぎます。あまりにも多くの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"'