如何在 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
。请注意,sh
的 read
内置函数仅在将换行符发送到 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
是否可以在 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
。请注意,sh
的 read
内置函数仅在将换行符发送到 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