Im konkreten Fall von printf
können Sie immer Folgendes tun:
echo {1..8} | xargs printf 'the number %s comes before %s\n'
weil printf
eine intrinsische xargs
-ähnlichen Fähigkeit mehrfach auszuführen , wenn es mehr Argumente gegeben ist , als es für einen einzelnen Aufruf benötigt. Das hat aber wenig Vorteil gegenüber
printf 'the number %s comes before %s\n' {1..8}
Bei großen Listen kann der einfache xargs
Befehl dazu führen xargs
, dass mehrere Instanzen von ausgeführt werden printf
, von denen einige möglicherweise eine ungerade Anzahl von Argumenten enthalten. Sie könnten zu gehen, -n 1000
um sich dagegen xargs
zu schützen, wobei 1000 eine gerade Zahl ist, die klein genug sein sollte, um die zu lange Grenze der Arg-Liste nicht zu erreichen , und groß genug, um zu vermeiden, dass so viele printf
s ausgeführt werden.
Beachten Sie, dass bei jedem Aufruf in einem separaten neuen Prozess xargs
nicht die integrierte printf
, sondern die externe Shell aufgerufen printf
wird.
Beachten Sie auch, dass eine leere Eingabe, außer bei einigen BSDs, immer noch printf
einmal ohne Argument ausgeführt wird. GNU xargs
und kompatibel haben eine -r
(oder --no-run-if-empty
) Option, um dies zu vermeiden.
Um es klar auszudrücken, diese einfache Antwort ist spezifisch für Ihr printf
Beispiel und würde in dem allgemeinen Fall nicht funktionieren, in dem Sie zwei Parameter gleichzeitig an Ihren Befehl übergeben müssen (wie dies beispielsweise der Fall wäre diff
). Um das allgemeine Problem mit zu lösen zsh
, können Sie verwenden:
for i j ({1..8}) echo "the number $i comes before $j"