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ì printfcó một xargskhả 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, xargslệnh đơn giản có thể dẫn đến việc xargschạ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để xargsbả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 printfs.
Lưu ý rằng xargssẽ 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 printfmột lần mà không có đối số. GNU xargsvà 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 printfví 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 ( diffví 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"