Việc một chương trình lấy đầu vào từ stdin
hoặc làm đối số dòng lệnh tùy thuộc vào người thiết kế. Cả hai phương pháp đều có giá trị của chúng. Tuy nhiên, đối với các chương trình hoạt động nghiêm ngặt trên các tệp, việc chuyển tên tệp dưới dạng đối số dòng lệnh sẽ thuận tiện hơn là thông qua stdin
.
Lý do rõ ràng nhất là trường hợp phổ biến, đó là chỉ chạy một chương trình trên một tệp, dễ gõ hơn: readlink file
thay vì echo file | readlink
.
Một vấn đề tinh vi hơn là tính đúng đắn. Vấn đề là khi tên tệp được truyền qua stdin
, chương trình cần có khả năng phân biệt tên tệp này với tên tệp khác. Thông thường, điều này được thực hiện bằng cách giả sử tên tệp được phân tách bằng khoảng trắng hoặc dòng mới, nhưng điều này không chính xác vì tên tệp có thể bao gồm khoảng trắng. Một cách tốt hơn là tách tên tệp bằng byte rỗng, nhưng có thể bất tiện khi tạo danh sách các tệp được phân tách bằng null.
Truyền tên tệp trên dòng lệnh sẽ tránh được vấn đề này vì shell xử lý tất cả các phân tích cú pháp và trích dẫn cho chương trình. Bạn có thể nhập touch $'foo\nbar'
và touch
xem chính xác đây là một tên tệp có chứa một dòng mới, mà không phải xử lý bất kỳ phân tích cú pháp hoặc trích dẫn đặc biệt nào.
Tất cả những gì đang được nói, nếu bạn muốn truyền tệp stdin
cho một chương trình cụ thể, bạn có thể. Đây là những gì xargs
dành cho. xargs
cho phép bạn có một chương trình chỉ chấp nhận các đối số trên dòng lệnh và thay vào đó làm cho nó đưa các đối số của nó đi qua stdin
.
Nói cách khác, nó cho phép bạn làm điều này : which my_script | xargs readlink
.
Nếu bạn muốn luôn làm readlink
việc theo cách này, bạn có thể tạo một bí danh : alias readlink="xargs readlink"
. Điều đó sẽ cho phép bạn gõ which my_script | readlink
, như bạn muốn ban đầu.
xargs
(không bao giờ bận tâm với Google về nó hoặc đọc trang người đàn ông), nhưng điều đó có ý nghĩa. Lần duy nhất tôi từng sử dụng xargs là mở danh sách các tệp trong vim, a lafind *.rb | xargs vim
. Bây giờ tôi hiểu những gì đang làm và tại sao nó hoạt động khifind *.rb | vim
không. Cảm ơn!