Erlang:如何访问CLI标志(参数)作为应用程序环境变量?

时间:2009-07-31 15:13:33

标签: command-line erlang arguments environment-variables

如何在Erlang中访问命令行标志(参数)作为环境变量。 (作为标志,而不是ARGV)例如:

RabbitMQ cli看起来像:

erl \
...
-sasl errlog_type error \
-sasl sasl_error_logger '{file,"'${RABBITMQ_SASL_LOGS}'"}' \
... # more stuff here

如果查看sasl.erl,您会看到以下行:

get_sasl_error_logger() ->
   case application:get_env(sasl, sasl_error_logger) of
% ... etc

通过一些未知的魔法,sasl_error_logger变量变成了一个erlang元组!我尝试在我自己的erlang application中复制它,但我似乎只能通过init:get_argument访问这些值,它将值作为字符串返回。

如何通过命令行传递值并能够以erlang术语轻松访问它们?

更新对于任何人来说,要以“常规”方式使用环境变量,请使用os:getenv("THE_VAR")

1 个答案:

答案 0 :(得分:8)

确保设置应用程序配置文件

{application, fred,
 [{description, "Your application"},
  {vsn, "1.0"},
  {modules, []},
  {registered,[]},
  {applications, [kernel,stdlib]},
  {env, [
    {param, 'fred'}
        ]
...

然后您可以像这样设置命令行:

-fred param 'billy'

我认为您需要在应用程序配置中使用参数来执行此操作 - 我从未以任何其他方式执行此操作...

更多信息(比将其放入评论更容易)

鉴于此

{emxconfig, {ets, [{keypos, 2}]}},

我当然可以这样做:

   {ok, {StorageType, Config}} = application:get_env(emxconfig),

(这可能很重要)我的应用程序此时已启动(实际上可能只是需要加载而不是实际上从查看application_controller代码开始)。