我正在使用CLI界面,并希望获得当前使用的终端的列数。
我找到the documentation for :io.columns,它就像iex中的一个魅力,但是一旦我用mix编译escript二进制文件,运行mix escript.build
,然后运行它,然后:io.columns
返回{error, enotsup}
。
IO设备未正确冒泡的情况如何?如何访问列号?
答案 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
被{调用时,stdin
和tput
不会连接到终端{1}}。