В конкретном случае 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 и достаточно большим, чтобы избежать запуска такого количества printf
s.
Обратите внимание, что 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"