Trong trường hợp cụ thể printf
, bạn luôn có thể làm:
echo {1..8} | xargs printf 'the number %s comes before %s\n'
bởi vì printf
có một xargs
khả năng giống như nội tại để thực thi nhiều lần nếu nó được đưa ra nhiều đối số hơn mức cần thiết cho một lệnh gọi. Mặc dù điều đó có ít lợi thế hơn
printf 'the number %s comes before %s\n' {1..8}
Và đối với các danh sách lớn, xargs
lệnh đơn giản có thể dẫn đến việc xargs
chạy một số trường hợp printf
, một số trong đó có thể có số lượng đối số lẻ. Bạn có thể vượt qua -n 1000
để xargs
bảo vệ chống lại điều đó, trong đó 1000 là một số chẵn đủ nhỏ để không đạt đến danh sách arg quá giới hạn quá dài và đủ lớn để tránh chạy quá nhiều printf
s.
Lưu ý rằng xargs
sẽ gọi, không phải nội dung của shell của bạn printf
, mà là bên ngoài printf
, với mỗi lần gọi trong một quy trình mới riêng biệt.
Cũng lưu ý rằng đối với đầu vào trống, ngoại trừ một số BSD, nó vẫn sẽ chạy printf
một lần mà không có đối số. GNU xargs
và tương thích có một tùy chọn -r
(hoặc --no-run-if-empty
) để tránh điều đó.
Để rõ ràng, câu trả lời đơn giản này là cụ thể cho printf
ví dụ của bạn và sẽ không hoạt động trong trường hợp chung khi bạn phải truyền hai tham số cho lệnh của mình ( diff
ví dụ như trường hợp ). Để giải quyết vấn đề chung với zsh
, bạn có thể sử dụng:
for i j ({1..8}) echo "the number $i comes before $j"