Dans le cas particulier de printf
, vous pouvez toujours faire:
echo {1..8} | xargs printf 'the number %s comes before %s\n'
car printf
a une xargs
capacité 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 xargs
commande simple peut entraîner l' xargs
exécution de plusieurs instances de printf
, dont certaines peuvent avoir un nombre impair d'arguments. Vous pouvez passer -n 1000
à xargs
pour 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 printf
s.
Notez que ce xargs
serait 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 printf
une fois sans argument. GNU xargs
et compatible ont une option -r
(ou --no-run-if-empty
) pour éviter cela.
Pour être clair, cette réponse simple est spécifique à votre printf
exemple 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 diff
par 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"