Im konkreten Fall von printfkönnen Sie immer Folgendes tun:
echo {1..8} | xargs printf 'the number %s comes before %s\n'
weil printfeine 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 xargsBefehl 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 1000um sich dagegen xargszu 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 printfs ausgeführt werden.
Beachten Sie, dass bei jedem Aufruf in einem separaten neuen Prozess xargsnicht die integrierte printf, sondern die externe Shell aufgerufen printfwird.
Beachten Sie auch, dass eine leere Eingabe, außer bei einigen BSDs, immer noch printfeinmal ohne Argument ausgeführt wird. GNU xargsund 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 printfBeispiel 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"