Эрланг: Как получить доступ к флагам (аргументам) CLI как к переменным среды приложения? - PullRequest
8 голосов
/ 31 июля 2009

Как получить доступ к флагу командной строки (аргументам) в качестве переменных среды в 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 application, но я, кажется, могу получить доступ к этим значениям только через init:get_argument, который возвращает значение в виде строки.

Как передать значения через командную строку и получить легкий доступ к ним как к терминам erlang?

ОБНОВЛЕНИЕ Также для тех, кто ищет, использовать переменные окружения «обычным» способом: os:getenv("THE_VAR")

1 Ответ

8 голосов
/ 31 июля 2009

Убедитесь, что вы настроили файл конфигурации приложения

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

...