En el caso específico de printf, siempre puedes hacer:
echo {1..8} | xargs printf 'the number %s comes before %s\n'
porque printftiene una xargscapacidad intrínseca de ejecutarse varias veces si se le dan más argumentos de los que necesita para una sola invocación. Aunque eso tiene poca ventaja sobre
printf 'the number %s comes before %s\n' {1..8}
Y para listas grandes, el xargscomando simple podría resultar en la xargsejecución de varias instancias printf, algunas de las cuales podrían tener un número impar de argumentos. Podría pasar -n 1000para xargsprotegerse de eso, donde 1000 es un número par que debería ser lo suficientemente pequeño como para no alcanzar el límite de la lista arg demasiado largo y lo suficientemente grande como para evitar ejecutar tantos printfs.
Tenga en cuenta que xargsllamaría, no a la construcción de su shell printf, sino a la externa printf, con cada invocación en un nuevo proceso separado.
También tenga en cuenta que para una entrada vacía, excepto en algunos BSD, todavía se ejecutaría printfuna vez sin argumento. GNU xargsy compatible tienen una -r
(o --no-run-if-empty) opción para evitar eso.
Para ser claros, esta respuesta simple es específica para su printfejemplo, y no funcionaría en el caso general en el que debe pasar dos parámetros a la vez a su comando (como sería el caso diff, por ejemplo). Para resolver el problema general con zsh, puede usar:
for i j ({1..8}) echo "the number $i comes before $j"