【问题标题】:Emulating 'named' process substitutions模拟“命名”进程替换
【发布时间】: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。与符号链接将读取操作转发到另一个文件不同,但在这种情况下,它需要是一个临时命名管道。

谢谢。

PS。 Somewhat similar question


编辑(来自 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


【解决方案1】:

据我所知,您所描述的内容并不存在,尽管这是一个有趣的想法。它需要内核支持,以便打开文件实际上会运行任意命令或脚本。

最好的办法是将长命令保存到 shell 函数或脚本中,以降低调用进程替换的难度。

【讨论】:

  • 是的,当我在 cmets Everything in UNIX is a file, it is possible 中告诉我时,我的意思是至少有内核支持。但是,我认为在这里使用内核支持对于一个太小的问题来说可能是一个太大的武器。
【解决方案2】:

有多种选择,具体取决于您需要什么以及您愿意付出多少努力。

如果你需要一个一次性文件,你可以使用mkfifo来创建文件,启动你的存档重定向到fifo,然后将fifo的文件名传递给需要从中读取的人。

如果您需要重复访问文件(可能同时访问),您可以使用 netcat 设置一个套接字,一遍又一遍地为解压缩文件提供服务。

对于“传统的 netcat”,这就像 while true; do nc -l -p 1234 -c "zcat myfile.tar.gz"; done 一样简单。使用 BSD netcat 会更烦人:

# Make a dummy FIFO
mkfifo foo

# Use the FIFO to track new connections
while true; do cat foo | zcat myfile.tar.gz | nc -l 127.0.0.1 1234 > foo; done

无论如何,一旦服务器(或基于文件的域套接字)启动,您只需执行nc localhost 1234 即可读取解压缩文件。您当然可以在其他地方使用nc localhost 1234 作为进程替换的一部分。

实际效果如下(图片可能最好在单独的标签中查看):

根据您的需要,您可能希望使 bash 脚本更复杂地用于缓存等,或者只是转储此内容并使用您熟悉的某种脚本语言使用常规 Web 服务器。

最后,这可能是最“异国情调”的解决方案,您可以编写一个 FUSE 文件系统,该文件系统呈现虚拟文件,支持您内心所需的任何逻辑。在这一点上,您可能应该好好思考一下,您要去的地方的可维护性和复杂性成本是否真的抵消了有人不得不多打几次zcat

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多