我需要维护一组保存在目录中的纯文本文件,这些文件都有一个从另一个文件中提取的部分。示例如下:
文件:
/directory/textfile1 (every other file in the directory needs to "include" the
full contents of this file, each file can do so at a
different starting position; this file changes often )
/directory/textfile2 ("includes" textfile1 after a few lines from the top )
/directory/textfile3 ("includes" textfile1 as a header )
/directory/textfile4 ("includes" textfile1 as a footer )
更改 textfile1 后,我希望文件系统读取命中 textfile{2..4} 以返回包含 textfile1 中新内容的更新版本。
在 Web 服务器上,这可以通过传统的服务器端包含指令来解决。现在,在不运行前端服务的情况下我该如何做到这一点?
我可以创建一个符号链接,而不是指向另一个 inode,而是运行一些自定义代码并将 stdout 显示为文件的内容,就像定义自定义“重新分析点”一样?
例如,假设的“符号链接”将为文件 textfile3 运行此命令:
cat /directory/textfile1 /directory/textfile3_static
从而模拟存在一个静态文件,其内容取决于textfile1。
我正在寻找一种使用最少定制量的解决方案,而不是为特殊安装点或类似的东西编写自定义 FUSE 模块。
我可能在这里思考错误的方向,也许在每次修改 textfile1 时触发更新脚本替换占位符会更容易?如何在不轮询的情况下捕获该事件?
这里有一些示例文本文件:
内容:
/directory/textfile1:
--------------------------------------------------------------------------------
Ferma non stai sei come un ciclone
e non dormi mai
--------------------------------------------------------------------------------
/directory/textfile2:
--------------------------------------------------------------------------------
Juny tu hai un cervellone
quasi tutto sai
Ma quando fai un'invenzione
sono sempre guai
Ferma non stai sei come un ciclone
e non dormi mai
Il centauro Nico ami già
ma lui forse non lo sa
--------------------------------------------------------------------------------
/directory/textfile3:
--------------------------------------------------------------------------------
Ferma non stai sei come un ciclone
e non dormi mai
Il centauro Nico ami già
ma lui forse non lo sa
Come sempre insisterai
allora che pasticci tu di nuovo farai
--------------------------------------------------------------------------------
...等等。 :)
答案1
以某种方式将@polynomial 答案翻译为bash
:
#!/bin/bash
if [[ ! -e textfile2 ]]; then
mkfifo textfile2
fi
while true; do
(
exec >textfile2
cat textfile2-header
cat textfile1
cat textfile2-footer
)
done
答案2
您可以使用命名管道来做到这一点。基本上,您可以将文本文件保存为“模板”和类似以下 perl 示例的脚本:
http://perl.active-venture.com/pod/perlipc-pipes.html
将“textfile3”作为管道打开,当它收到读取请求时,它将转储 textfile3 应包含的内容(可能通过读取 textfile3.template 并根据需要替换内容)。这将允许您动态更改内容,而无需更新多个文件并且只需最少的配置。