为什么:运行escript时io.columns失败

时间:2017-02-26 00:24:56

标签: io command-line-interface elixir

我正在使用CLI界面,并希望获得当前使用的终端的列数。

我找到the documentation for :io.columns,它就像iex中的一个魅力,但是一旦我用mix编译escript二进制文件,运行mix escript.build,然后运行它,然后:io.columns返回{error, enotsup}

IO设备未正确冒泡的情况如何?如何访问列号?

2 个答案:

答案 0 :(得分:1)

没有发现为什么它不起作用,但我会发布我使用的解决方案:直接与bash对话

$ tput cols以bash为单位给出了列数,所以

对于灵药:System.cmd("tput", ["cols"])
对于erlang::os.cmd('tput cols')

答案 1 :(得分:0)

这是由于最近的Erlang / OTP版本中的confirmed bug。该错误很可能会在下一版本中修复。

在解决错误之前,以下变通办法可能会很有用:

-module(test).

-export([main/1]).

main(_) ->
    io:format("Nr of columns: ~p~n",[my_columns()]).

my_columns() ->
    Parent = self(),
    spawn(
      fun()->
              Port = erlang:open_port({spawn, "tput cols"},
                                      [use_stdio, in, stream,{line, 10000}]),
              Columns =
                  receive
                      {Port, {data, {_,Line}}} ->
                          erlang:list_to_integer(Line)
                  end,
              Parent ! {my_columns_msg, Columns},
              spawn(fun Reader() ->
                            receive
                                {_Port, {data, {_,_}}} ->
                                    Reader();
                                _ -> ok
                            end
                    end)
      end),
    receive
        {my_columns_msg, Columns} -> Columns
    end.

请注意,调用os:cmd("tput cols")(在@nichochar的答案中建议)不起作用,因为当stdout被{调用时,stdintput不会连接到终端{1}}。