sort "$f1"
không thành công cho các giá trị $f1
bắt đầu bằng -
hoặc ở đây đối với trường hợp sort
một số bắt đầu bằng +
(có thể gây hậu quả nghiêm trọng cho một tệp được gọi là -o/etc/passwd
chẳng hạn).
sort -- "$f1"
(nơi --
báo hiệu sự kết thúc của các tùy chọn) giải quyết hầu hết các vấn đề đó nhưng vẫn không thành công cho tệp được gọi -
(thay vào đó sort
diễn giải là stdin của nó).
sort < "$f1"
Không có những vấn đề đó.
Đây là cái vỏ mở tập tin. Điều đó cũng có nghĩa là nếu tệp không thể được mở, bạn cũng sẽ nhận được thông báo lỗi hữu ích hơn (ví dụ: hầu hết các shell sẽ chỉ ra số dòng trong tập lệnh) và thông báo lỗi sẽ nhất quán nếu bạn sử dụng chuyển hướng bất cứ nơi nào có thể để mở tập tin.
Và trong
sort < "$f1" > out
(trái với sort -- "$f1" > out
), nếu "$f1"
không thể mở, out
sẽ không được tạo / cắt và sort
thậm chí không chạy.
Để xóa một số nhầm lẫn có thể xảy ra (theo các bình luận bên dưới), điều đó không ngăn lệnh mmap()
nhập tệp hoặc lseek()
vào bên trong tệp (không phải điều sort
đó) với điều kiện là bản thân tệp có thể tìm kiếm được. Sự khác biệt duy nhất là tệp được mở trước đó và trên bộ mô tả tệp 0 bằng vỏ trái ngược với lệnh sau có thể trên một bộ mô tả tệp khác. Lệnh vẫn có thể tìm kiếm / mmap mà fd 0 khi nó vừa ý. Điều đó không có gì khó hiểu cat file | cmd
khi cmd
stdin lần này là một đường ống không thể được ghép / tìm kiếm.