2016-12-07 8 views
2

Можно ли написать на stdin внешнего процесса В Elixir? Является ли NIF единственным вариантом прямо сейчас?Как написать stdin внешнего процесса в Elixir

Процесс, который начался с 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 
+2

Отъезд Порты: http://elixir-lang.org/docs/stable/elixir/Port.html. В частности, 'Port.open/2' и' Port.command/3'. – Dogbert

+0

Это тоже похоже: https://stackoverflow.com/questions/10872909/erlang-read-stdin-write-stdout – Stratus3D

+0

@ Stratus3D Я ищу обратное, чтобы написать в stdin. – LemmonMaxwell

ответ

4

Для этого можно использовать Port. Обратите внимание, что read, встроенный в sh, получит данные только тогда, когда символ новой строки будет отправлен на 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