В конкретном случае printfвы всегда можете сделать:
echo {1..8} | xargs printf 'the number %s comes before %s\n'
потому что printfимеет внутренне- xargsподобную способность выполнять несколько раз, если ему дается больше аргументов, чем нужно для одного вызова. Хотя это имеет небольшое преимущество перед
printf 'the number %s comes before %s\n' {1..8}
А для больших списков простая xargsкоманда может привести к xargsзапуску нескольких экземпляров printf, некоторые из которых могут иметь нечетное количество аргументов. Вы можете перейти -n 1000к этому, xargsчтобы защититься от этого, где 1000 - это четное число, которое должно быть достаточно маленьким, чтобы не достигать слишком длинного предела списка arg и достаточно большим, чтобы избежать запуска такого количества printfs.
Обратите внимание, что xargsбудет вызывать не встроенную оболочку printf, а внешнюю printf, с каждым вызовом в отдельном новом процессе.
Также обратите внимание, что для пустого ввода, за исключением некоторых BSD, оно все равно будет запускаться printfодин раз без аргументов. GNU xargsи совместимые имеют -r
(или --no-run-if-empty) возможность избежать этого.
Для ясности, этот простой ответ специфичен для вашего printfпримера и не будет работать в общем случае, когда вы должны передавать команде два параметра за раз (как diff, например, будет). Чтобы решить общую проблему с zsh, вы можете использовать:
for i j ({1..8}) echo "the number $i comes before $j"