Створіть віртуальний файл, який насправді є командою


18

Чи є якийсь спосіб створити віртуальний файл, такий, що читання з файлу насправді читається з stdoutкоманди команди; запис у файл - це фактично запис у stdinкоманду?

Поки я це знаю з inotifywaitфайлом у файлі, який викликає команду, коли файл модифікується, приймаючи його з файлу і записуючи його назад.

Мені не подобається, що inotifywaitтреба постійно перезавантажувати (і я повинен переконатися, що він завжди працює). Я використовую цей файл, можливо, двічі на тиждень.

Відповіді:


17

Ви можете шукати названу трубу .

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

Запис на трубу не запускає програму прослуховування. Якщо ви хочете обробити вхід у циклі, вам потрібно тримати програму прослуховування.

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

Зверніть увагу, що всі дані, записані в трубу, об'єднані, навіть якщо є кілька записів процесів. Якщо читання декількох процесів, дані отримує лише один. Тому труба може бути непридатною для одночасних ситуацій.

Іменований сокет може працювати з одночасними з'єднаннями, але це виходить за рамки можливостей для базових сценаріїв оболонки.

На самому складному кінці шкали знаходяться призначені для користувача файлові системи , яка дозволяє проектувати і монтувати файлову систему , де кожен open, writeі т.д., викликає відповідну функцію в режимі. Мінімальна інвестиція - це десятки рядків нетривіального кодування, наприклад в Python . Якщо ви хочете виконувати команди лише під час читання файлів, ви можете використовувати scriptfs або fuseflt .


3

Деякі речі, які слід пам’ятати щодо названих труб: Труба не може, на відміну від файлу, мати декілька читачів. Після того, як його зміст буде прочитаний, він зник. Отже, вам потрібно зробити цикл, тобто вам потрібно буде постійно штовхати вміст у трубу від автора.

Я сам шукав відповідь на це питання, і єдине, що мені вдалося придумати, - це сценарії , засновані на запобіжниках .


1

Те, що ви описуєте, по суті є спеціальним файлом FIFO, див fifo(7). Вони створені компанією mkfifo(1), і процес може потім відкрити їх під Linux для R / W (не всі Unixy системи справляються з цим). Потім два незалежні процеси можуть використовувати його для спілкування.


0

Найпростіший спосіб "Створити віртуальний файл, який насправді є командою" - це розширити файлову систему FUSE. Це дуже просто зробити з такими бібліотеками, як фузепі.

Ось приклад файлової системи FUSE, яка дозволяє читати файли HTTP / HTTPS / FTP так, ніби вони були у вашому власному вікні Linux. Ви можете аналогічно створити щось, що виконує будь-яку команду для того ж на прочитаному.

Якщо ви подивитеся на вихідний код, це навряд чи 50 рядків коду (за винятком будь-якого кодового коду).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.