假设我做了一个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。