Secondo la documentazione POSIX, xargs
dovrebbe eseguire l'utilità data con argomenti delimitati da spazi o newline, e questo è ciò che accade nei tuoi primi due esempi.
Tuttavia, quando --replace
(o -I
) viene utilizzato, solo le nuove righe delimiteranno gli argomenti. Il rimedio è dare xargs
argomenti su righe separate:
$ printf '%s\n' a b c | xargs --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c y
Utilizzo delle opzioni POSIX:
printf '%s\n' a b c | xargs -n 1 -I "{}" echo x "{}" y
Ecco, do xargs
non una riga ma tre. Prende una riga (al massimo) ed esegue l'utility con quella come argomento.
Nota anche che -n 1
(o --max-args=1
) in quanto sopra non è necessario in quanto è il numero di sostituzioni effettuate da -I
che determina il numero di argomenti utilizzati:
$ printf '%s\n' a b c | xargs -I "{}" echo x "{}" y
x a y
x b y
x c y
In effetti, la sezione Razionale delle specifiche POSIX su xargs
dice (corsivo mio)
Il
-I
,-L
e-n
le opzioni si escludono a vicenda . Alcune implementazioni usano l'ultima specificata se ne viene fornita più di una su una riga di comando; altre implementazioni trattano le combinazioni delle opzioni in modi diversi.
Durante il test, ho notato che la versione di OpenBSD di xargs
farà quanto segue se -n
e -I
sono usati insieme:
$ echo a b c | xargs -n 1 -I "{}" echo x "{}" y
x a y
x b y
x c y
Questo è diverso dal xargs
di GNU coreutils fa (che produce x a b c y
). Ciò è dovuto all'implementazione che accetta gli spazi come delimitatore di argomento con -n
, anche se -I
viene usato. Quindi, non usare -I
e -n
insieme (non è comunque necessario).