2009-07-31 18 views
7

如何在Erlang中访问命令行标志(参数)作为环境变量。 (作为标志,而非argv)例如:Erlang:如何访问CLI标志(参数)作为应用程序环境变量?

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条件一样轻松访问它们?

UPDATE也为寻找,使用环境变量在“常规”方式使用os:getenv("THE_VAR")

回答

7

确保您建立了一个应用程序配置文件

{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), 

(这可能是重要的),我的应用程序是在这个时候开始(实际上可能只需要到b e加载并且实际上并未从查看application_controller代码开始)。

+0

艾伦,感谢您的提示。我的`.app`文件中有参数。好消息:我得到`.app`文件中指定的默认值。坏消息:我似乎无法在命令行上覆盖它。 – 2009-07-31 16:06:32