Как получить имя программы в программе escript?

У меня есть программа Erlang, предназначенная для запуска с использованием escript:

% filename: myscript.erl
-export([main/1]).

main(Args) ->
    io:format("Args: ~p~n", [Args]).

Когда я бегу escript myscript.erl 123 456, это напечатано:

Args: ["123","456"]

Это хорошо, но где название программы (т.е. myscript.erl)?

В С, например, в int main(int argc, char *argv[]) { ... }, argv[0] всегда содержит название программы. Как я могу получить название программы на Erlang?

1 ответ

Решение

Из документов Erlang escript:

Чтобы получить путь к сценарию, позвоните escript:script_name() из вашего сценария (путь обычно, но не всегда, абсолютный).

Вот оно в действии:

myescript.erl:

-export([main/1]).

main(Args) ->
    io:format("Args: ~p~n~p~n", [Args, escript:script_name()]).

В оболочке bash:

~/erlang_programs$ escript myescript.erl 123 456
Args: ["123","456"]
"myescript.erl"

а также:

~/erlang_programs$ cd

~$ escript erlang_programs/myescript.erl 123 456
Args: ["123","456"]
"erlang_programs/myescript.erl"

Таким образом, несмотря на то, что говорят документы, я получаю путь относительно каталога, из которого я выпускаю escript команда, или, что то же самое, путь, который я передаю escript команда.

Почему путь заключен в двойные кавычки? Как это можно удалить?

В эрланге термин "a" это сокращенная запись списка [97], Точно так же термин "erlang_programs/myescript.erl" сокращение для списка [101, 114, ...108], Вы должны повторять это для себя каждый раз, когда видите, что оболочка распечатывает что-то с двойными кавычками. Тот факт, что оболочка выводит строки в двойных кавычках вместо списков, которые они действительно представляют, является ужасной особенностью оболочки и приводит к неописуемому замешательству как для начинающих, так и для опытных эрлангеров. "Эй, давайте распечатать исходные оценки студента по последним трем тестам, которые были [97,98,99]:

9> io:format("Student scores: ~p~n", [[97,98,99]]).
Student scores: "abc"
ok

Wtf??!

Вот несколько способов удалить кавычки для вывода:

1) При выводе с io:format/2Вы можете использовать управляющую последовательность ~ s:

s: Печатает аргумент со строковым синтаксисом. Аргументом является... iolist(), бинарный () или atom()... Символы печатаются без кавычек.

Например:

1> io:format("~s~n", ["hello"]).
hello
ok

2> 

(В комментариях к этому списку добавлен кредит!)

2) Вы можете преобразовать список (например, "abc") в атом:

~$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> list_to_atom("a").
a

2> list_to_atom([97]).
a

3> "a" =:= [97].
true
Другие вопросы по тегам