Nel caso specifico di printf, puoi sempre fare:
echo {1..8} | xargs printf 'the number %s comes before %s\n'
perché printfha una xargscapacità intrinseca simile a quella di eseguire più volte se gli vengono dati più argomenti di quelli necessari per una singola invocazione. Anche se questo ha poco vantaggio
printf 'the number %s comes before %s\n' {1..8}
E per elenchi di grandi dimensioni, il semplice xargscomando potrebbe comportare l' xargsesecuzione di diverse istanze di printf, alcune delle quali potrebbero avere un numero dispari di argomenti. Potresti passare -n 1000per xargsproteggerti da questo, dove 1000 è un numero pari che dovrebbe essere abbastanza piccolo da non raggiungere la lista arg limite troppo lungo e abbastanza grande da evitare di eseguire così tanti printfs.
Si noti che xargschiamerebbe non l'integrato della shell printf, ma l'esterno printf, con ogni invocazione in un nuovo processo separato.
Si noti inoltre che per un input vuoto, ad eccezione di alcuni BSD, verrebbe comunque eseguito printfuna volta senza argomenti. GNU xargse compatibili hanno un'opzione -r
(o --no-run-if-empty) per evitarlo.
Per essere chiari, questa semplice risposta è specifica per il tuo printfesempio e non funzionerebbe nel caso generale in cui devi passare due parametri alla volta al tuo comando (come sarebbe il caso diff, ad esempio). Per risolvere il problema generale con zsh, è possibile utilizzare:
for i j ({1..8}) echo "the number $i comes before $j"