тл;др;вот как это можно было сделать переносимым, без -I
и других ломаных причудливых опций:
$ echo a b c d f g | xargs -n 2 sh -c 'echo "$@" LAST' sh
a b LAST
c d LAST
f g LAST
$ seq 1 100000 | xargs sh -c 'echo "$#" LAST' sh
23692 LAST
21841 LAST
21841 LAST
21841 LAST
10785 LAST
Проблема с опцией -I
заключается в том, что она нарушена по замыслу, и ее невозможно обойти:
$ echo a b c d f g | xargs -I {} -n 1 echo {} LAST
a b c d f g LAST
$ echo a b c d f g | xargs -I {} -n 2 echo {} LAST
{} LAST a b
{} LAST c d
{} LAST f g
Но они, вероятно, застрахованы, потому что так сказано в стандарте.:
-I replstr ^[XSI] [Option Start] Insert mode: utility is executed for each line from standard input, taking the entire line as a single argument, inserting it in arguments for each occurrence of replstr.
И ничего не говорится о взаимодействии с опциями -n
и -d
, так что они вольны делать что хотят.
Вот как это происходит на (более старой )FreeBSD, менее неожиданной, но не -стандартной:
fzu$ echo a b c d f g | xargs -I {} -n 2 echo {} LAST
a b LAST
c d LAST
f g LAST
fzu$ echo a b c d f g | xargs -I {} -n 1 echo {} LAST
a LAST
b LAST
c LAST
d LAST
f LAST
g LAST