是否可以创建一个可供任何进程使用的“文件”,而无需实际将文件保存在磁盘上?

是否可以创建一个可供任何进程使用的“文件”,而无需实际将文件保存在磁盘上?

假设我做了一个grep给我带来很多结果的事情。我想使用 grep 的输出并将其传递给以文件名作为第一个参数的命令。例如 -

myCommand filename.txt

我想做这样的事情 -

grep "xyz" | myCommand

但是,由于 myCommand 不从 stdin 读取,因此该管道不起作用。我不想用 grep 的结果在磁盘上创建临时文件。是否可以通过任何其他方式创建一个“文件”,比如在内存中并让myCommand使用它?

答案1

一个简单的解决方案是使用 Bash 对进程替换的支持,如下所示:

myCommand <(grep "xyz" somefile)

这会将命令的输出连接grep到文件描述符,然后将/dev/fd/NNN(其中NNN是 fd 编号)作为输入文件传递给您的命令(例如,您的命令实际上可能会运行为myCommand /dev/fd/63)。这个解决方案才不是创建一个临时文件。

您还可以创建一个命名管道并使用它来传输数据:

$ mkfifo /tmp/myfifo
$ grep "xyz somefile > /tmp/myfifo &
$ myCommand /tmp/myfifo

但实际上,第一个解决方案更简单。

斯蒂芬·查泽拉斯评论:

zsh 还具有 myCommand =(grep xyz somefile) ,它使用常规临时文件(适用于 myCommand 无法接受管道的情况)。

这很重要,因为某些命令期望能够对其输入文件执行随机访问,这不适用于管道。使用此语法,您可以享受临时文件的好处,而无需担心自己清理它们。

答案2

现在大多数发行版都包含用于此目的的 RAM 磁盘。您可以像平常一样向其中写入文件,它通常称为/dev/shm.你可以像这样检查你是否有它:

$ mount |grep shm
tmpfs on /dev/shm type tmpfs (rw)

如果你有它,你可以像任何其他文件系统一样写入它:

$ echo "hello world" > /dev/shm/somefile.txt

并使用普通工具查看它:

$ ls -l /dev/shm/
total 680
-r-------- 1 saml saml 67108904 Jul 22 20:55 pulse-shm-3981461026
-r-------- 1 saml saml 67108904 Jul 18 18:06 pulse-shm-799251885
-rw-rw-r-- 1 saml saml       12 Jul 24 10:59 somefile.txt

然而,这不消耗实际的磁盘空间,而是使用 RAM。

相关内容