【发布时间】:2014-06-05 12:43:08
【问题描述】:
假设我有一个很大的 gzip 文件 data.txt.gz,但通常需要将未压缩的版本提供给程序。当然,与其创建一个独立的解包data.txt,不如使用process substitution 语法:
./program <(zcat data.txt.gz)
但是,根据具体情况,这可能会令人厌烦且容易出错。
有没有办法模拟 named 进程替换?也就是说,创建一个伪文件data.txt,它会在被访问时“展开”为进程替换zcat data.txt.gz。与符号链接将读取操作转发到另一个文件不同,但在这种情况下,它需要是一个临时命名管道。
谢谢。
编辑(来自 cmets)实际用例是有一个大型 gzip 语料库,除了以原始形式使用外,有时还需要使用一系列轻量级操作(标记化、小写、等),然后喂给一些“更重”的代码。存储经过预处理的副本会浪费磁盘空间,并且重复重新键入完整的预处理管道可能会引入错误。同时,动态运行管道会产生很小的计算开销,因此需要一个长期存在的伪文件来隐藏细节。
【问题讨论】:
-
您是否可以选择使用
fuse-zip安装 zip? -
@hek2mgl 有趣。
-
澄清一下,您的意思是一个长期存在的文件系统条目,无论何时打开它都会运行
zcat ...,而不是像mkfifo data.txt; zcat data.txt.gz > data.txt这样的显式命名管道,对吗? -
@hek2mgl 感谢您的建议,但这只是部分解决方案。解压缩是一个玩具示例,实际上替换更复杂,涉及多个管道进程等。
-
而且
./program <(zcat data.txt.gz)甚至可以在不分叉的情况下更高效:./program <(exec zcat data.txt.gz)
标签: bash unix named-pipes process-substitution