open_port не работает, когда опция `exit_status` не используется - PullRequest
3 голосов
/ 01 июля 2011

Когда я вызываю open_port без exit_status, в приведенном ниже примере это невозможно:

Eshell V5.7.5  (abort with ^G)
1>  P = open_port({spawn, "cat >bar"}, [stream, use_stdio]).
#Port<0.498>
2> port_command(P, "hello\n").
** exception error: bad argument
     in function  port_command/2
        called as port_command(#Port<0.498>,"hello\n")

Но когда я просто добавляю exit_status и оставляю все то же самое, это работает:

Eshell V5.7.5  (abort with ^G)
1> P = open_port({spawn, "cat >bar"}, [stream, use_stdio, exit_status]).
#Port<0.498>
2> port_command(P, "hello\n").
true

Из документации я не понимаю разницы в поведении.

Ответы [ 2 ]

5 голосов
/ 02 июля 2011

Когда вы перенаправляете вывод в файл в cat >bar, командная оболочка закрывает stdout, и в этом случае Erlang просто закрывает порт, потому что порты пытаются использовать вывод команды по умолчанию и закрываются на eof. Правильный способ исправить это - использовать параметр out, так как butter71 уже предложен. Такие параметры, как out, exit_status, error_to_stdout, указывают портам не беспокоиться о stdout.

4 голосов
/ 01 июля 2011

попробуйте установить порт только для вывода:

P = open_port({spawn, "cat >bar"}, [stream, use_stdio, out]).
port_command(P, "hello\n").

Я предполагаю, что Эрланг несчастен, потому что вы перенаправили стандартный вывод команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...