Могу ли я создать «файл», который при открытии на самом деле дает вывод команды?

251
LukeGT

Я оказался в нескольких ситуациях, когда мне хотелось бы иметь такой «файл», который по сути запускает скрипт, когда он «открывается», что позволяет мне «читать» его вывод.

Например, у меня может быть файл конфигурации в каком-то проекте, который я хотел бы использовать локально, но из-за различий в моей машине мне нужно запустить sed или grep поверх него, чтобы он работал. Файл конфигурации проекта все еще поддерживается, и я хотел бы, чтобы эти изменения появились в моей локальной конфигурации. Это означает, что нужно выполнить простую вещь, изменив ее, а затем сохранить ее, что не является идеальным, поскольку она легко устареет при обновлении проекта. Я хотел бы, чтобы фильтрация происходила каждый раз, когда я открываю свой локальный файл конфигурации.

Есть ли способ для меня, чтобы достичь такого рода вещи? Я знаю, что виртуальная файловая система позволяет вам показывать некоторые довольно сумасшедшие вещи как «файлы», поэтому я чувствую, что это не за пределами возможного.

4
Проблема в том, что вам нужно записывать в файл одновременно с чтением. Что вам нужно, это программа, чтобы открыть файл в этих мониторах, когда ваш файл изменяется. Основная проблема заключается в том, что содержимое файла будет в памяти, и если что-то изменит файл на диске, то какая из них является верной, правильной версией файла? Kinnectus 9 лет назад 0
Я пытаюсь избежать всей этой загадки, никогда не имея на самом деле записанного, отфильтрованного файла. Вместо этого команда запускается каждый раз, когда я получаю доступ к «файлу», а содержимое «файла» является выходом этой команды каждый раз. Вывод команды никогда не попадает на диск. LukeGT 9 лет назад 0
Я думаю, что ваш скрипт будет легче запускаться и просто выводить результаты в новый файл (ваш новый ini for). Ваш скрипт может использовать sed или grep, и вы можете использовать различные инструменты поиска и фильтрации, чтобы убедиться, что ваш выходной файл сформирован правильно. Kinnectus 9 лет назад 0
Я знаю, что могу это сделать, но это решение требует ручного вмешательства каждый раз, когда изменяется исходный файл, что упрощает отфильтрованную версию, если я не внимательный. LukeGT 9 лет назад 0
Это, конечно, не идеально, но самое простое решение, вероятно, состоит в том, чтобы просто установить задание cron, которое периодически запускает любую фильтрацию, которая вам нужна для удаленного файла, и выводит ее в локальный файл. Предполагая, что это не очень сложная или длительная фильтрация, ее можно запускать каждую минуту или что-то еще, чтобы сохранить ваш файл свежим. daenris 9 лет назад 1

1 ответ на вопрос

4
PioneerAxon

Теоретически это возможно, используя LD_PRELOAD с желаемой программой.

Напишите библиотеку для добавления оболочки над «открытыми» системными вызовами и используйте исходную программу (скажем cat) как LD_PRELOAD=/path/to/library cat.

Код overridden_open () в библиотеке-оболочке будет выглядеть примерно так же, как и в следующем фиктивном коде.

/* This is an illustrative code, and doesn't follow any good coding practice. */ int overridden_open (...) { /* Only do this for the config file. */ if (strcmp (filename, "/path/to/required/config/file") == 0) { /* Download a fresh copy, and if successful, overwrite the existing file. */ if (system ("wget -O /path/to/required/config/file.tmp http://remote.file/url") == 0 && system ("<perform awk/sed/grep operations>") == 0) { system ("mv /path/to/required/config/file.tmp /path/to/required/config/file"); } } return open (...); } 

Похожие вопросы