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

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

有没有办法创建一个虚拟文件,以便从文件中读取实际上是从stdout命令中读取的;写入文件实际上是写入stdin命令的?

到目前为止,我已经将其与inotifywait文件上的一个组合在一起,该文件在修改文件时调用命令,从文件中获取输入并写回文件。

我不喜欢必须inotifywait不断重新启动(并且我必须确保它始终运行)。我每周大约只使用该文件两次。

答案1

您可能正在寻找命名管道

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。如果只想在读取文件时执行命令,可以使用脚本文件系统或者熔丝

答案2

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

我自己一直在寻找这个问题的答案,而我能想到的唯一的另一件事是脚本文件系统这是基于保险丝

答案3

您所描述的本质上是一个 FIFO 特殊文件,请参阅fifo(7)。它们由 创建mkfifo(1),然后进程可以在 Linux 下打开它们进行读/写(并非所有 Unixy 系统都能处理)。然后两个独立的进程可以使用它进行通信。

答案4

这个问题是模棱两可的。 stdin/stdout 是管道/流。文件是随机访问的。换句话说,当访问文件时,会涉及到偏移量,并且没有办法通过 stdin/stdout 将这些传递给命令。

如果您确实想要没有地址的管道/流行为,请使用命名管道,或等效地设置虚拟终端(pty),例如使用“socat”。然后,您的命令会在另一端监听并响应。但是,访问该文件的任何内容都必须作为串行设备进行。我不确定Linux中的任何文件路径如何可以简单地“作为流/管道”访问。例如,“cat”命令实际上会以编程方式打开文件,但不确定具体细节,但我认为它不会像打开任何常规文件系统文件那样打开它,因为这会涉及地址。

如果您需要随机访问,请研究 NBD、NBDkit、libFUSE、BUSE、scriptfs、python-fuse。

相关内容