Podle dokumentace POSIX xargs
by měl spustit daný nástroj s argumenty oddělenými buď mezerami nebo novými řádky, a to je to, co se děje ve dvou vašich prvních příkladech.
Když však --replace
(nebo -I
), argumenty oddělují pouze nové řádky. Náprava je dát xargs
argumenty na samostatných řádcích:
$ printf '%s\n' a b c | xargs --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c y
Použití možností POSIX:
printf '%s\n' a b c | xargs -n 1 -I "{}" echo x "{}" y
Zde dávám xargs
ne jeden řádek, ale tři. Zabere jeden řádek (maximálně) a spustí obslužný program s tímto argumentem.
Všimněte si také, že -n 1
(nebo --max-args=1
) ve výše uvedeném není potřeba, protože jde o počet nahrazení provedených -I
který určuje počet použitých argumentů:
$ printf '%s\n' a b c | xargs -I "{}" echo x "{}" y
x a y
x b y
x c y
Ve skutečnosti jde o sekci Rationale specifikace POSIX na xargs
říká (můj důraz)
-I
,-L
a-n
možnosti se vzájemně vylučují . Některé implementace používají poslední zadanou, pokud je na příkazovém řádku uvedeno více než jedna; jiné implementace zacházejí s kombinacemi možností různými způsoby.
Během testování jsem si všiml, že verze OpenBSD xargs
pokud -n
provede následující a -I
se používají společně:
$ echo a b c | xargs -n 1 -I "{}" echo x "{}" y
x a y
x b y
x c y
To se liší od xargs
GNU coreutils dělá (což vytváří x a b c y
). To je způsobeno implementací, která akceptuje mezery jako oddělovač argumentů s -n
, i když -I
se používá. Takže nepoužívejte -I
a -n
společně (stejně to není potřeba).