Nat*_*ray 8 erlang command-line arguments environment-variables
如何在Erlang中访问命令行标志(参数)作为环境变量.(作为标志,而不是ARGV)例如:
RabbitMQ cli看起来像:
erl \
...
-sasl errlog_type error \
-sasl sasl_error_logger '{file,"'${RABBITMQ_SASL_LOGS}'"}' \
... # more stuff here
Run Code Online (Sandbox Code Playgroud)
如果sasl.erl
你看到你看到线:
get_sasl_error_logger() ->
case application:get_env(sasl, sasl_error_logger) of
% ... etc
Run Code Online (Sandbox Code Playgroud)
通过一些未知的魔法,sasl_error_logger
变量变成了一个erlang元组!我试过在我自己的erlang中复制它application
,但我似乎只能通过init:get_argument
它来访问这些值,它将值作为字符串返回.
如何通过命令行传递值并能够以erlang术语轻松访问它们?
更新同样对于任何人来说,以"常规"方式使用环境变量os:getenv("THE_VAR")
确保设置应用程序配置文件
{application, fred,
[{description, "Your application"},
{vsn, "1.0"},
{modules, []},
{registered,[]},
{applications, [kernel,stdlib]},
{env, [
{param, 'fred'}
]
...
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样设置你的命令行:
-fred param 'billy'
Run Code Online (Sandbox Code Playgroud)
我认为您需要在应用程序配置中使用参数来执行此操作 - 我从未以任何其他方式执行此操作...
更多信息(比评论更容易)
鉴于这种
{emxconfig, {ets, [{keypos, 2}]}},
Run Code Online (Sandbox Code Playgroud)
我当然可以这样做:
{ok, {StorageType, Config}} = application:get_env(emxconfig),
Run Code Online (Sandbox Code Playgroud)
但是(这可能很重要)我的应用程序此时启动(可能实际上只需要加载而不是实际上从查看application_controller代码开始).