Nel caso specifico di printf
, puoi sempre fare:
echo {1..8} | xargs printf 'the number %s comes before %s\n'
perché printf
ha una xargs
capacità 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 xargs
comando potrebbe comportare l' xargs
esecuzione di diverse istanze di printf
, alcune delle quali potrebbero avere un numero dispari di argomenti. Potresti passare -n 1000
per xargs
proteggerti 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 printf
s.
Si noti che xargs
chiamerebbe 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 printf
una volta senza argomenti. GNU xargs
e compatibili hanno un'opzione -r
(o --no-run-if-empty
) per evitarlo.
Per essere chiari, questa semplice risposta è specifica per il tuo printf
esempio 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"