Tạo một tệp ảo thực sự là một lệnh


18

Có cách nào để tạo một tệp ảo, sao cho việc đọc từ tệp thực sự đọc từ stdoutlệnh; ghi vào tập tin là viết stdinmột cách chính xác vào lệnh?

Cho đến nay tôi đã loại bỏ điều này bằng inotifywaitmột tệp trên một tệp, gọi lệnh khi tệp được sửa đổi, lấy đầu vào từ tệp và ghi lại vào tệp.

inotifywaitMặc dù vậy, tôi không muốn phải liên tục khởi động lại (và tôi phải đảm bảo rằng nó luôn chạy). Tôi chỉ sử dụng tập tin này có lẽ hai lần một tuần.

Câu trả lời:


17

Bạn có thể đang tìm kiếm một đường ống được đặt tên .

mkfifo f
{
  echo 'V cebqhpr bhgchg.'
  sleep 2
  echo 'Urer vf zber bhgchg.'
} >f
rot13 < f

Viết vào ống không bắt đầu chương trình nghe. Nếu bạn muốn xử lý đầu vào trong một vòng lặp, bạn cần tiếp tục chạy chương trình nghe.

while true; do rot13 <f >decoded-output-$(date +%s.%N); done

Lưu ý rằng tất cả dữ liệu được ghi vào đường ống được hợp nhất, ngay cả khi có nhiều quá trình viết. Nếu nhiều quá trình đang đọc, chỉ có một quá trình nhận được dữ liệu. Vì vậy, một đường ống có thể không phù hợp cho các tình huống đồng thời.

Một ổ cắm có tên có thể xử lý các kết nối đồng thời, nhưng điều này vượt quá khả năng cho các kịch bản shell cơ bản.

Vào cuối phức tạp nhất của quy mô là hệ thống tập tin tùy chỉnh , cho phép bạn thiết kế và gắn kết một hệ thống tập tin trong đó mỗi open, writevv, gây nên một hàm trong một chương trình. Đầu tư tối thiểu là hàng chục dòng mã hóa không cần thiết, ví dụ như trong Python . Nếu bạn chỉ muốn thực thi các lệnh khi đọc tệp, bạn có thể sử dụng scriptfs hoặc fuseflt .


3

Một số điều cần lưu ý liên quan đến các đường ống được đặt tên: Một đường ống không thể - không giống như một tệp - có nhiều người đọc. Khi nội dung của nó được đọc, nó sẽ biến mất. Vì vậy, bạn cần phải lặp, tức là bạn sẽ cần liên tục đẩy nội dung vào đường ống từ người viết.

Tôi đã tự mình tìm kiếm câu trả lời cho câu hỏi này và điều duy nhất khác mà tôi có thể đưa ra là các tập lệnh dựa trên cầu chì .


1

Những gì bạn mô tả về cơ bản là một tập tin đặc biệt của FIFO, xem fifo(7). Chúng được tạo bởi mkfifo(1)và một quy trình sau đó có thể mở chúng trong Linux cho R / W (không phải tất cả các hệ thống Unix đều xử lý việc đó). Hai quá trình độc lập sau đó có thể sử dụng nó để giao tiếp.


0

Cách dễ nhất để "Tạo một tệp ảo thực sự là một lệnh" là mở rộng hệ thống tệp FUSE. Nó rất dễ dàng để làm với các thư viện như fusepy.

Dưới đây là một ví dụ về hệ thống tệp FUSE cho phép bạn đọc các tệp HTTP / HTTPS / FTP như thể chúng có mặt trên hộp Linux của riêng bạn. Bạn có thể tương tự tạo một cái gì đó chạy bất kỳ lệnh nào cho cùng đọc.

Nếu bạn nhìn vào mã nguồn thì khó có 50 dòng mã (không bao gồm bất kỳ mã soạn sẵn nào).

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.