Tại sao hai lệnh 'mèo' này lại có kết quả khác nhau?


12

Giả sử rằng infile chứa một văn bản cụ thể và tôi đã thực thi các nhóm lệnh sau:

thực hiện 3<infile

mèo -n <&3

mèo -n <&3

Trường hợp đầu tiên của con mèo sẽ hiển thị nội dung của tập tin, nhưng lần thứ hai dường như không làm gì cả. Tại sao chúng khác nhau?

Câu trả lời:


29

Chúng trông giống như một lệnh nhưng lý do chúng khác nhau là trạng thái hệ thống đã thay đổi do kết quả của lệnh đầu tiên. Cụ thể, cái đầu tiên đã cattiêu thụ toàn bộ tệp, vì vậy cái thứ hai catkhông còn gì để đọc, chạm vào EOF (cuối tệp) ngay lập tức và thoát.

Lý do đằng sau điều này là bạn đang sử dụng cùng một mô tả tệp chính xác (mô tả bạn đã tạo exec < infilevà gán cho bộ mô tả tệp 3) cho cả hai cách gọi cat. Một trong những điều liên quan đến mô tả tệp mở là phần bù tệp. Vì vậy, người đầu tiên catđọc toàn bộ tệp, để lại phần bù ở cuối và phần thứ hai cố gắng nhận từ cuối tệp và không tìm thấy gì để đọc.


12

Chỉ cần thêm vào câu trả lời hay của @ jw013, có thể giúp nhận ra rằng nó giống như

{
   cat -n
   cat -n
} < infile

< fileviết tắt của 0< file, đó là sử dụng mô tả tệp 0 thay vì 3.

Và chỉ để nhầm lẫn một chút, phiên bản này:

exec 3< infile
cat -n /dev/fd/3
cat -n /dev/fd/3

Xử lý khác nhau tùy thuộc vào hệ điều hành bạn chạy nó trong và loại của infile(tập tin thường xuyên vs ống vs thiết bị ...)

Trên Solaris và hầu hết các Unice thương mại, một open("/dev/fd/3")hoặc ít hơn tương đương với một dup(3)( < /dev/fd/3tương tự như <&3), trong khi trên Linux, đối với các tệp thông thường, /dev/fd/3được triển khai như một liên kết tượng trưng cho tệp gốc, do đó, open("/dev/fd/3")mở lại từ đầu ( và có thể với các cờ khác nhau từ fd 3).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.