4

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

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

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

1 ответ1

4

Теоретически это возможно, используя 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 (...);
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .