如何在 Elixir 中写入外部进程的标准输入

How to write to stdin of external process in Elixir

是否可以在 Elixir 中写入外部进程的标准输入? NIF 是目前唯一的选择吗?

从 Elixir 启动的进程阻塞并等待用户输入:

pid = spawn(fn ->
   System.cmd("sh", [
    Path.join([System.cwd, "sh", "wait_for_input"]),
   "Hello world"
  ])
end)

我想实现这样的目标

IO.write pid, "Hello"
IO.write pid, "Hello again"

这是脚本

#!/bin/sh
while read data
do
  echo $data >> file_output.txt
done

您可以为此使用 Port。请注意,shread 内置函数仅在将换行符发送到 sh 时才获取数据,因此您需要在希望将缓冲数据发送到 [=] 时添加它12=].

$ cat wait_for_input
while read data
do
  echo $data >> file_output.txt
done
$ iex
iex(1)> port = Port.open({:spawn, "sh wait_for_input"}, [])
#Port<0.1260>
iex(2)> Port.command port, "foo\n"
true
iex(3)> Port.command port, "bar\n"
true
iex(4)> Port.close(port)
true
$ cat file_output.txt
foo
bar