En el caso específico de printf
, siempre puedes hacer:
echo {1..8} | xargs printf 'the number %s comes before %s\n'
porque printf
tiene una xargs
capacidad 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 xargs
comando simple podría resultar en la xargs
ejecución de varias instancias printf
, algunas de las cuales podrían tener un número impar de argumentos. Podría pasar -n 1000
para xargs
protegerse 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 printf
s.
Tenga en cuenta que xargs
llamarí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 printf
una vez sin argumento. GNU xargs
y 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 printf
ejemplo, 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"