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).