![创建一个实际上是命令的虚拟文件](https://linux22.com/image/29699/%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%AE%9E%E9%99%85%E4%B8%8A%E6%98%AF%E5%91%BD%E4%BB%A4%E7%9A%84%E8%99%9A%E6%8B%9F%E6%96%87%E4%BB%B6.png)
有没有办法创建一个虚拟文件,以便从文件中读取实际上是从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 脚本的能力。
最复杂的一端是自定义文件系统,它允许您设计和安装一个文件系统,其中每个open
、write
等触发程序中的一个函数。最小的投资是数十行不平凡的编码,例如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。