Một điểm khác biệt là khi sử dụng thay thế lệnh thay vì đường ống, kích thước của dữ liệu được truyền bị giới hạn bởi kích thước của bộ đệm lệnh, do đó, nó bị cắt ngắn trong một số trường hợp không có cảnh báo. Điều này cũng có nghĩa là toàn bộ đầu ra lệnh phải được tạo ra và được lưu trữ trong bộ nhớ, trước khi nó được chuyển sang lệnh tiếp theo, vì vậy đối với các đầu ra lớn, bạn có thể sử dụng nhiều bộ nhớ hơn mức cần thiết.
Một vấn đề khác với phương thức đầu tiên là đầu ra được phân chia trên khoảng trắng, vì vậy bạn không thể xử lý tên tệp có khoảng trắng trong chúng. xargs
cũng bị ảnh hưởng bởi vấn đề khoảng trắng, nhưng nó có thể được khắc phục bằng cách thay đổi dấu phân cách được sử dụng. Để xử lý đúng tên tệp bằng cách này, bạn sẽ cần sử dụng byte null làm dấu phân cách trong ví dụ thứ hai.
Một vấn đề thứ ba là các khối được mở rộng, vì vậy nếu một tệp có dấu hoa thị hoặc dấu hỏi trong tên của nó, sẽ có kết quả không mong muốn.
Bạn có thể tìm thấy một cuộc thảo luận thú vị về vấn đề này tại đây: http://mywiki.wooledge.org/ParsingLs
Cú pháp đúng sẽ là
echo rm *
hoặc nếu bạn phải sử dụng xargs,
find . -maxdepth 1 -print0 | xargs -0 echo rm
Loại bỏ echo
khi đầu ra có vẻ đúng.
xargs
cũng chạy trong một lớp con do đường ống, trừ khi bạn kích hoạtshopt -s lastpipe
, trong trường hợp đó, nó sẽ chạy trong trình bao hiện tại. Tôi không nghĩ rằng việc chạy trong một subshell là một vấn đề mặc dù trong trường hợp này, vì bạn không thay đổi bất kỳ biến nào.