通过控制台在已经运行的 shell 中运行 erlang shell 命令
Posted
技术标签:
【中文标题】通过控制台在已经运行的 shell 中运行 erlang shell 命令【英文标题】:Running erlang shell command, via console, in an already-running shell 【发布时间】: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 调用。然后,您可以向这些脚本添加命令以实现您想要的任何内容。
【参考方案1】:
为什么要从zenity
运行命令而不只是获取结果? (或者你可以运行echo
。)
1> Port = open_port(spawn_executable, os:find_executable("zenity"), [in, line, 65536, eof, args, ["--calendar", "--title=Holiday Planner"]]).
#Port<0.490>
2> flush().
Shell got #Port<0.490>,data,eol,"10/20/2016"
Shell got #Port<0.490>,eof
ok
【讨论】:
以上是关于通过控制台在已经运行的 shell 中运行 erlang shell 命令的主要内容,如果未能解决你的问题,请参考以下文章