创建实际上是命令的虚拟文件


18

有什么方法可以创建虚拟文件,从而从文件中读取实际上是从stdout命令的读取中;写入文件就是stdin通过命令写入?

到目前为止,我已经inotifywait在文件上加上了一个错误,当文件被修改时,该命令会调用命令,并从文件中获取输入并写回。

我不喜欢inotifywait但是必须不断重新启动(并且我必须确保它始终在运行)。我可能每周只使用一次此文件。

Answers:


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

请注意,即使有多个写入过程,所有写入管道的数据也会合并。如果正在读取多个进程,则只有一个进程获取数据。因此,管道可能不适用于并发情况。

命名套接字可以处理并发连接,但这超出了基本Shell脚本的功能。

在天平的最复杂的年底都是定制的文件系统,它可以让你设计并安装文件系统,其中每个openwrite等等,在程序触发功能。最小的投资是数十行非平凡的编码,例如在Python中。如果只想在读取文件时执行命令,则可以使用scriptfsfuseflt


3

关于命名管道,需要注意一些事项:与文件不同,管道不能具有多个读取器。读取其内容后,它就消失了。因此,您需要循环,即需要不断地将内容从编写器推送到管道中。

我一直在寻找这个问题的答案,而我唯一能想到的就是基于fuse的scriptfs


1

您所描述的实际上是FIFO专用文件,请参见fifo(7)。它们由创建mkfifo(1),然后一个进程可以在Linux下为R / W打开它们(并非所有Unixy系统都可以处理)。然后,两个独立的进程可以使用它进行通信。


0

“创建实际上是命令的虚拟文件”的最简单方法是扩展FUSE文件系统。使用funky之类的库非常容易。

这是一个FUSE文件系统的示例,该文件系统使您可以读取HTTP / HTTPS / FTP文件,就像它们在您自己的Linux盒子中一样。您可以类似地创建一些内容,以便在读取时为相同的内容运行任何命令。

如果您查看源代码,则几乎没有50行代码(不包括任何样板代码)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.