把自己绑在量子土豆上,你即将进入一个你从未知道存在的痛苦世界。
一个负责任的程序员会告诉你,没有办法做到这一点,当然不是便携式的。
现在,“不便携”这个短语已经被像 CHAR_BIT != 8 这样的迂腐狂热的梦想所淡化,以巧妙地说服每个人“不便携”意味着 “构建了一些 LSD 上瘾的系统在 60 年代后期无法运行这个” 或 “不会在 Windows 上运行”。
不,您将要遇到的是导致我们的祖先自愿使用自动工具的可移植性问题。真的,真的,不可移植到不同的系统,甚至是 POSIX“兼容”系统。
正如您可能想象的那样,做到这一点的明智方法是依赖 Ncurses 之类的东西,但正如许多生活必需品一样,Erlang 不存在非 NIF 实现。
尽管我刚刚给了你所有这些警告,这就是我过去在紧要关头所做的事情:
-module(thing).
-compile(export_all).
get_char() ->
Ch = io:get_chars("p: ", 1),
io:fwrite("Ch: ~w", [Ch]).
start() ->
io:setopts([{binary, true}]),
get_char().
独自一人,这当然行不通。因此,您需要从另一个设置适当的 termios 输入标志的脚本调用您的脚本。正如我之前提到的,这在过去是一个真正的废话,我还没有听到任何让我相信情况已经改变的消息。
#!/bin/sh
stty --f /dev/tty icanon raw
erl -pa ./ -run thing start -run init stop -noshell
stty echo echok icanon -raw
也可以在 Erlang 程序中调用“stty”或发送魔法字符,但如果没有记忆,您需要使用-noshell 调用erl 并添加额外的@987654329 @像time和echo 0这样的咒语。
我过去遇到的另一个问题是,虽然您可以安全地使用 get_chars,但其他 io 函数会失败,因为其中一些函数有自己的内置“在线烹饪”。
如果这一切还没有让你相信计算机对人类来说是一场灾难,你可以在优秀的书籍The Linux Programming Interface 中阅读更多关于这方面的细节。
祝你好运。