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

jsj*_*jsj 24 files stdin

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

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

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

Gil*_*il' 21

您可能正在寻找命名管道

mkfifo f
{
  echo 'V cebqhpr bhgchg.'
  sleep 2
  echo 'Urer vf zber bhgchg.'
} >f
rot13 < f
Run Code Online (Sandbox Code Playgroud)

写入管道不会启动监听程序。如果你想在一个循环中处理输入,你需要保持一个监听程序运行。

while true; do rot13 <f >decoded-output-$(date +%s.%N); done
Run Code Online (Sandbox Code Playgroud)

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

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

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


uni*_*010 5

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

我自己一直在寻找这个问题的答案,我唯一能想出的另一件事是基于fuse 的scriptfs