我正在尝试使用外部过程它读取 STDIN,并写入 STDOUT。
我想在 Elixir 中编写与此等效的内容,而不使用外部库或包装脚本:
$ echo foo | nkf
foo
即发送数据到nkf
在 stdin 上,并从返回转换后的结果nkf
的标准输出,知道它已经完成了流的处理。
我试图用端口来做到这一点,但问题是单个发送的消息可以在多个接收到的消息中返回,因此无法判断何时到达消息末尾(简化的示例,"foo"
实际上是一个完整的文件):
iex(1)> port = Port.open({:spawn, "nkf -u"}, [:binary])
#Port<0.7>
iex(2)> Port.command(port, "foo")
true
iex(3)> flush
{#Port<0.7>, {:data, "fo"}}
{#Port<0.7>, {:data, "o"}}
:ok
如何在 Elixir 中获得与 Ports 相同的 bash 管道行为?
光束当前不提供关闭流的方法to进程并等待流from完成发送的过程。使用端口,关闭端口还将关闭来自外部进程的流,即使该进程尚未完成发送数据。因此,目前不可能仅使用内置功能 - 有必要寻求外部工具的帮助,例如瓷 or erlexec.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)