【问题标题】:How to pipe virtual files?如何管道虚拟文件?
【发布时间】:2016-04-29 21:59:58
【问题描述】:

我正在使用这些命令来转换 inkscape 中的一些文件:

python dxf_input.py sample.dxf > output_ink.svg
python scour.inkscape.py output_ink.svg > output.svg

这种方法效果很好。但是,我不想创建文件“output_ink.svg”。相反,我想将此文件传递给第二个命令。

我已经尝试了很多东西。

使用 xargs:

python dxf_input.py sample.dxf | xargs python scour.inkscape.py > output.svg

scou.inkscape.py:错误:没有这样的选项:-3

python dxf_input.py sample.dxf | xargs -I{} python scour.inkscape.py {} > output.svg

xargs: 参数行太长

使用先进先出:

python scour.inkscape.py <(>(python dxf_input.py sample.dxf))

xml.parsers.expat.ExpatError:未找到元素:第 1 行,第 0 列

使用常规管道:

python dxf_input.py sample.dxf | python scour.inkscape.py > output.svg

IOError: [Errno 32] 管道损坏

到目前为止没有任何效果。

【问题讨论】:

  • 您知道scour.inkscape.py 是否需要在其文件中查找吗?
  • ...另外,您是从哪里获得&lt;(&gt;(...)) 语法的?
  • xargs 永远不会工作。 a | xargs b - 从 a 获取输出,并将其转换为程序 b 的命令行参数。例如echo 1 2 3|xargs grep somefile 相当于只依次运行 grep somefile 1grep somefile2grep somefile 3
  • @CharlesDuffy 我不认识那个。
  • 这是这里的关键问题,因为不可能在 FIFO 中寻找。

标签: linux bash pipe cat inkscape


【解决方案1】:

并非所有程序可以接受来自任何类型的 FIFO 的输入——无论是常规管道、命名管道、/dev/fd/NN 描述符(由 &lt;() 在平台上创建是允许的)等——因为 FIFO 本质上是不可搜索的:您不能像使用常规文件那样回到开头并重新读取先前的内容;你不能直接跳到文件的不同部分然后再回来;等等

因此,在需要“管道”的限制内,不存在适用于所有可能程序的解决方案。


首先,如果scour.inkscape.py 可以从 FIFO 中读取:

python scour.inkscape.py <(python dxf_input.py sample.dxf)

如果它不能从 FIFO 中读取,而是需要一个常规文件,则 bash 没有相关的原语,但 zsh 有:

# This needs zsh, not bash
python scour.inkscape.py =(python dxf_input.py sample.dxf)

【讨论】:

  • 我已经试过了。它说“xml.parsers.expat.ExpatError: no element found: line 1, column 0”
  • 大概它需要一个真实的文件,而不是 FIFO。需要深入了解源代码以了解原因,并且由于您没有链接到该软件...
  • @ChristophBühler,...我已经修改以展示一种仅适用于 zsh 的方法,即使存在这种限制,它也可以工作。
  • 我猜你是对的。谢谢你。我将创建文件!
  • ...或者您可以适当地修补scour.inkscape.py,以便能够流式传输其输入。
猜你喜欢
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 2016-09-29
  • 2021-06-12
相关资源
最近更新 更多