Могу ли я создать "файл", который при открытии на самом деле дает вывод команды?
Я оказался в нескольких ситуациях, когда мне хотелось бы иметь такой "файл", который по сути запускает скрипт, когда он "открывается", что позволяет мне "читать" его вывод.
Например, у меня может быть файл конфигурации в каком-то проекте, который я хотел бы использовать локально, но из-за различий в моей машине мне нужно запустить sed или grep, чтобы он работал. Файл конфигурации проекта все еще поддерживается, и я хотел бы, чтобы эти изменения появились в моей локальной конфигурации. Это означает делать простую вещь, изменяя ее, а затем сохраняя ее, что не является идеальным, поскольку она легко становится устаревшей при обновлении проекта. Я хотел бы, чтобы фильтрация происходила каждый раз, когда я открываю свой локальный файл конфигурации.
Есть ли способ для меня, чтобы достичь такого рода вещи? Я знаю, что виртуальная файловая система позволяет вам показывать некоторые довольно сумасшедшие вещи как "файлы", поэтому я чувствую, что это не за пределами возможного.
1 ответ
Теоретически это возможно, используя 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 (...);
}