Laut POSIX-Dokumentation xargs
sollte das angegebene Dienstprogramm mit Argumenten ausführen, die entweder durch Leerzeichen oder Zeilenumbrüche getrennt sind, und dies geschieht in den beiden ersten Beispielen von Ihnen.
Wenn jedoch --replace
(oder -I
) verwendet wird, werden Argumente nur durch Zeilenumbrüche getrennt. Abhilfe schafft hier xargs
Argumente in separaten Zeilen:
$ printf '%s\n' a b c | xargs --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c y
Verwendung von POSIX-Optionen:
printf '%s\n' a b c | xargs -n 1 -I "{}" echo x "{}" y
Hier gebe ich xargs
ein nicht eine Zeile, sondern drei. Es dauert (höchstens) eine Zeile und führt das Dienstprogramm mit dieser als Argument aus.
Beachten Sie auch, dass -n 1
(oder --max-args=1
) oben wird nicht benötigt, da es sich um die Anzahl der Ersetzungen durch -I
handelt das bestimmt die Anzahl der verwendeten Argumente:
$ printf '%s\n' a b c | xargs -I "{}" echo x "{}" y
x a y
x b y
x c y
Tatsächlich ist der Begründungsabschnitt der POSIX-Spezifikation auf xargs
sagt (meine Betonung)
Der -I
, -L
, und -n
Optionen schließen sich gegenseitig aus . Einige Implementierungen verwenden die zuletzt angegebene, wenn mehr als eine in einer Befehlszeile angegeben wird; andere Implementierungen behandeln Kombinationen der Optionen auf unterschiedliche Weise.
Beim Testen ist mir aufgefallen, dass die OpenBSD-Version von xargs
Folgendes tun, wenn -n
und -I
werden zusammen verwendet:
$ echo a b c | xargs -n 1 -I "{}" echo x "{}" y
x a y
x b y
x c y
Dies unterscheidet sich von xargs
von GNU coreutils tut (was x a b c y
erzeugt ). Dies liegt daran, dass die Implementierung Leerzeichen als Argumenttrennzeichen mit -n
akzeptiert , obwohl -I
wird genutzt. Verwenden Sie also nicht -I
und -n
zusammen (wird sowieso nicht benötigt).