通过控制台在已经运行的 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 运行$ &lt;command line 1&gt; 否则运行$ &lt;command line 2&gt; 我希望这个命令行在现有的 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 命令的主要内容,如果未能解决你的问题,请参考以下文章

原因:在 erl 控制台 [Erlang] 中运行常见测试时 undef

让两个 erl shell 在 OS X 上对话

erl模块翻译

将命令传递给erl?

<erl></erl> 中的 Yaws 代码未运行

如何在不中止 erl 的情况下中止 Erlang shell (erl) 中的接收语句?