Tuổi thọ của một mô tả tập tin là gì?


11

Như được mô tả ở đây , chuyển hướng sử dụng open()để ghi vào một tập tin. Có một bộ mô tả tệp bên trong (?) Được tạo trong trình bao, và sau đó được sử dụng khi cần.

Là mô tả bên trong được tạo cho toàn bộ thời gian của tập lệnh hoặc thời gian sống của shell? Có phải nó bị phá hủy sau một thời gian, một số hoạt động, vv?

Ý tôi là mô tả tệp cụ thể cho các tệp mà chính trình bao mở cho các hoạt động của nội dung của nó. Là mô tả được tạo và tập tin được mở cho mỗi hoạt động? Chúng được giữ trong bao lâu? Thí dụ:

#!/bin/bash
>>x echo something
...do many other things not related to the file x
>>x echo something more

Là phiên bản mô tả đầu tiên được giữ cho đến khi hoạt động thứ hai?

Những gì về vỏ tôi sử dụng trong một thiết bị đầu cuối? Đôi khi tôi giữ một phiên mở trong nhiều ngày, thậm chí vài tuần. Nó vẫn giữ các mô tả cho tất cả các tệp mà tôi đã vận hành với shell dựng sẵn?

Câu trả lời:


4

Tóm lại: Một shell sẽ gần như chắc chắn đóng các mô tả tệp liên quan đến chuyển hướng ngay sau khi lệnh hoàn thành.


Chi tiết: Không có đề cập rõ ràng về việc đóng các tệp được mở thông qua các chuyển hướng trong POSIX (theo như tôi có thể thấy). Nhưng không đóng chúng ngay lập tức sẽ không hữu ích.

Các quy tắc cho môi trường, bất kỳ lệnh nào được bắt đầu trong không cho phép chuyển các mô tả tệp bổ sung. Shell sẽ cần phải cẩn thận để đóng bất kỳ fd nào được lưu khi bắt đầu một lệnh không nên có chúng.

Đối với các > filenamechuyển hướng đầu ra thông thường , trong trường hợp tệp cần phải được cắt bớt khi bắt đầu mỗi lệnh, ngay cả khi bộ mô tả tệp đã được lưu. Và bất kỳ mô tả tệp đã lưu nào sẽ trỏ đến một tệp sai nếu tệp bị liên quan bị đổi tên hoặc xóa trong khi đó.

Ví dụ, điều này sẽ không hoạt động chính xác nếu fd mở cho lần đầu tiên echođược giữ mở và được sử dụng như là cho lần thứ hai:

echo foo >> x; mv x y; echo bar >> x

Mô hình fork + exec thông thường được sử dụng để khởi động các chương trình bên ngoài cũng giúp cho các tệp tự động đóng lại rất dễ dàng khi lệnh thoát. Shell chỉ cần fork()trước tiên và mở bất kỳ tệp cần thiết nào trong tiến trình con, trước khi gọi exec()để thay thế con bằng lệnh thực tế. Khi tiến trình con thoát ra, mọi tệp được mở bởi nó sẽ tự động bị đóng.


Trongawk Mặc dù vậy, cú pháp để chuyển hướng đầu ra tương tự như vỏ, nhưng bất kỳ tập tin mở được giữ mở cho đến khi thoát kịch bản, trừ khi đóng một cách rõ ràng. Điều này sẽ chỉ mở foomột lần và sẽ không cắt nó ở giữa các bản in:

awk 'BEGIN { print "a" > "foo"; print "b" > "foo" }'

6

Chúng được đóng lại khi kết thúc với. Shell sẽ tạo 3 mô tả tệp 0,1,2 cho mỗi lệnh mà nó chạy. Đây chỉ là những con số, những con số được tái sử dụng. Shell sẽ đóng các tệp trước khi sử dụng lại các mô tả.

Mô tả tập tin cũng được truyền vào các quy trình khác. Và nếu bạn có một quá trình trong nền thì nó vẫn sẽ có các mô tả tập tin.

Ví dụ sử dụng 3>&1, điều này có nghĩa là làm cho mô tả tệp 3 tham chiếu đến tệp mà mô tả 1 hiện đang đề cập đến.

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.