POSIX ドキュメントによると、 xargs
スペースまたは改行で区切られた引数を使用して、指定されたユーティリティを実行する必要があります。これが、最初の2つの例で発生することです。
ただし、 --replace
の場合 (または -I
) が使用されている場合、改行のみが引数を区切ります。救済策は xargs
を与えることです 別々の行の引数:
$ printf '%s\n' a b c | xargs --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c y
POSIX オプションの使用:
printf '%s\n' a b c | xargs -n 1 -I "{}" echo x "{}" y
ここでは xargs
を与えます 1行ではなく3行。 1 行 (最大) で、それを引数としてユーティリティを実行します。
-n 1
にも注意してください (または --max-args=1
) は、 -I
によって行われた置換の数であるため、必要ありません。 使用される引数の数を決定します:
$ printf '%s\n' a b c | xargs -I "{}" echo x "{}" y
x a y
x b y
x c y
実際、xargs
の POSIX 仕様の根拠セクション 言う (私の強調)
-I
、 -L
、および -n
オプションは相互に排他的です .いくつかの実装では、コマンドラインで複数指定された場合、最後に指定されたものを使用します。他の実装では、オプションの組み合わせをさまざまな方法で扱います。
これをテストしているときに、OpenBSD のバージョンの xargs
が -n
の場合は次のようになります と -I
一緒に使用されます:
$ echo a b c | xargs -n 1 -I "{}" echo x "{}" y
x a y
x b y
x c y
これは、GNU coreutils の xargs
とは異なります。 します (これは x a b c y
を生成します) )。これは、実装が -n
の引数区切り文字としてスペースを受け入れるためです。 、 -I
でも 使用されている。したがって、-I
は使用しないでください。 および -n
一緒に (いずれにしても必要ありません)。