【发布时间】:2017-12-26 14:32:20
【问题描述】:
我正在尝试在使用Port.open 运行 shell 命令时设置环境变量。无论我传入什么,它都会引发错误,ArgumentError。
port = Port.open({ :spawn_executable, "/usr/local/bin/cool" },
[:stream, :in, :binary, :eof, :hide,
{:env, [{"COOL_ENV", "cool"}]},
{ :args, ["test.js"] }])
根据 Port.open 的 Elixir 文档,它应该接受 Erlang 函数 :erlang.open_port 接受的任何参数。 Erlang 文档提到:
{env, Env} 仅对 {spawn, Command} 和 {spawn_executable, 文件名}。启动过程的环境使用扩展 Env.中的环境规范。
Env 是元组 {Name, Val} 的列表,其中 Name 是 一个环境变量,Val 是它在 衍生端口进程。 Name 和 Val 都必须是字符串。唯一的那个 例外是 Val 是原子 false(类似于 os:getenv/1, 删除环境变量。 (http://erlang.org/doc/man/erlang.html#open_port-2)
即使我尝试像这样直接调用 erlang 函数也会出现此错误:
:erlang.open_port({:spawn_executable, "/usr/local/bin/cool"}, [:stream, :in, :binary, :eof, :hide, {:env, [{"COOL", "cool"}] },{:args, ["test.js"]}])
如果我删除 {:env, [{...}] 参数,错误就会消失。
【问题讨论】: