【发布时间】:2017-02-25 18:27:30
【问题描述】:
早上好!
我正在尝试在 erlang shell 和仅通过脚本进行通信的外部函数 (zenity) 之间建立通信。(它只能运行命令行)
在我的程序中,erlang shell 已经在运行并生成了我需要的节点。 (所以打开另一个 shell 来运行函数不起作用,escript 打开一个新 shell。我需要从我的主 shell 运行函数)
这是我手动做的,并且想编写脚本。
$ erl -name two@127.0.0.1
Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false]
Eshell V7.3 (abort with ^G)
(two@127.0.0.1)1> c(client).
{ok,client}
(two@127.0.0.1)2> client:init().
true
(two@127.0.0.1)3>
client:init() 产生线程。我通过一些功能与他们交流。
从这里我用
运行我的不同功能client:<function>(<Args>).
不过是一个脚本
erl -name two@127.0.0.1
c(client).
client:init()
client:<function>(<Args>).
显然,它不起作用。
我可以缩短一点
$ erl -name two@127.0.0.1 -s client init
但我仍然无法在创建的 shell 上运行函数,因为要调用的函数取决于 Zenity 的输出,该输出仅通过 shell 命令行进行通信
是否有通过脚本运行 erlang 命令的解决方案?
【问题讨论】:
-
您正在寻找escript。
-
当您说“依赖于 Zenity 的输出”时,您的意思是 Zenity 将消息打印到您想要操作的标准输出,还是实际上返回您可以使用的有用值?
-
如果我理解得很好,Zenity 会弹出图形窗口、显示信息或要求输入。并允许读取该条目并运行 shell 命令。例如,打开一个框,询问年龄,用户填写,如果年龄 > 18,Zenity 运行
$ <command line 1>否则运行$ <command line 2>我希望这个命令行在现有的 erlang shell 上运行一个函数跨度> -
如果您使用 rebar (rebar generate-node node-id=foobar) 生成节点/发布,它将为您创建大量内容,包括用于启动和停止节点的 shell 脚本,与它交流,以及其他东西。它通过“nodetool”与它进行通信,它为您生成一个 escript,它会进行 RPC 调用。然后,您可以向这些脚本添加命令以实现您想要的任何内容。