Unix 如何在Elixir中写入外部进程的stdin

Unix 如何在Elixir中写入外部进程的stdin,unix,erlang,pipe,elixir,mkfifo,Unix,Erlang,Pipe,Elixir,Mkfifo,是否可以在Elixir中写入外部过程的stdin?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" 这是剧

是否可以在Elixir中写入外部过程的stdin?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
你可以用这个。请注意,
sh
read
内置程序仅在换行符发送到
sh
时才会获取数据,因此您需要在需要将缓冲数据发送到
read
时添加该程序

$ 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
$cat等待\u输入
读取数据时
做
echo$data>>文件_output.txt
完成
$iex
iex(1)>port=port.open({:spawn,“sh wait_for_input”},[]))
#港口
iex(2)>Port.command端口,“foo\n”
真的
iex(3)>Port.command端口,“bar\n”
真的
iex(4)>端口关闭(端口)
真的
$cat file_output.txt
福
酒吧

签出端口:。具体来说,
Port.open/2
Port.command/3
。这似乎也有关联:@Stratus3D我正在寻找相反的方法,写入stdin。@Dogbert当我运行命令时,它会发送数据,但是我没有看到它写入外部进程的stdin。@LemmonMaxwell您能发布一个您正在使用
sh
执行的脚本的简化版本并将数据写入其中,以便我可以重现错误吗
Port.command
应该可以工作:
iex(1)>Port=Port.open({:spawn,“sh”},[]);命令(端口,“echo 1\n”);iex(2)>刷新{#端口,{:数据,'1\n'}}