Dans le cas particulier de printf, vous pouvez toujours faire:
echo {1..8} | xargs printf 'the number %s comes before %s\n'
car printfa une xargscapacité intrinsèque à s'exécuter plusieurs fois si on lui donne plus d'arguments que nécessaire pour une seule invocation. Bien que cela ait peu d'avantages par rapport à
printf 'the number %s comes before %s\n' {1..8}
Et pour les grandes listes, la xargscommande simple peut entraîner l' xargsexécution de plusieurs instances de printf, dont certaines peuvent avoir un nombre impair d'arguments. Vous pouvez passer -n 1000à xargspour vous prémunir contre cela, où 1000 est un nombre pair qui devrait être suffisamment petit pour ne pas atteindre la limite d' argument trop longue et suffisamment grande pour éviter d'exécuter autant de printfs.
Notez que ce xargsserait appeler, non pas le shell de votre shell printf, mais l'externe printf, à chaque invocation dans un nouveau processus distinct.
Notez également que pour une entrée vide, sauf sur certains BSD, elle fonctionnerait toujours printfune fois sans argument. GNU xargset compatible ont une option -r
(ou --no-run-if-empty) pour éviter cela.
Pour être clair, cette réponse simple est spécifique à votre printfexemple et ne fonctionnerait pas dans le cas général où vous devez passer deux paramètres à la fois à votre commande (comme ce serait le cas diffpar exemple). Pour résoudre le problème général avec zsh, vous pouvez utiliser:
for i j ({1..8}) echo "the number $i comes before $j"