在带有参数的erlang中运行命令

Posted

技术标签:

【中文标题】在带有参数的erlang中运行命令【英文标题】:Run a command in erlang with a parameter 【发布时间】:2012-02-29 14:10:51 【问题描述】:

我正在尝试为 ejabberd 编写一个 erlang 模块,但无法完全确定语法。

我想做的是当用户发送离线消息时,运行我编写的脚本。

on_offline(_From, To, _Packet) ->
        ?INFO_MSG("recieved offline packet to ~p", [To]),
        ?INFO_MSG("Got offline message", []),
        osReturn = os:cmd("/opt/ejabberd-2.1.10/newmods/handleoffline.py " ++ To),
        ?INFO_MSG("Send to handler and got return ~s", [osReturn]),
        none.

但是当我运行它时,我得到了一些错误,如果我有 ++ 到那里我得到错误

E(:ejabberd_hooks:294) : function_clause,

但是,即使我在没有 ++ 的情况下运行它,我也会收到另一个错误,告诉我匹配错误。

我想做的就是使用用户 ID 的第一部分运行 handleoffline.py,有人有什么建议吗?

【问题讨论】:

请发布完整的错误和不带 ++ 的代码。 一个错误是osReturn是一个原子,应该是OsReturn 【参考方案1】:

根据您提供的少量信息并假设您的函数正在使用 ejabberd offline_message_hook 调用,我至少可以找到一个问题。 在

osReturn = os:cmd("/opt/ejabberd-2.1.10/newmods/handleoffline.py " ++ To)

您正在尝试使用 ++ 将您提供的列表与 To 连接起来。但主要问题是 To 不是字符串(列表),这会产生错误。你的函数的形式是

on_offline(From, To, Packet) -> ok

在哪里 收件人 = 发件人 = #jid(见jlib)

纠正这种情况的一种方法是使用

on_offline(_From, To=#jiduser = User, server=Server, _Packet) ->
  ...
  OsReturn = os:cmd("/opt/ejabberd-2.1.10/newmods/handleoffline.py " ++ User),
  ?INFO_MSG("Send to handler and got return ~s", [OsReturn]),
  none.

因为 #jid 上的字段 user 是一个字符串。

编辑:另一个错误是您需要将 osReturn 更改为 OsReturn 因为第一个是原子并且会在您的代码中引发错误,就像 selle 指出的那样


如果您有更多问题,请编辑您的问题并添加更多信息,或者让这个问题更清晰。

【讨论】:

以上是关于在带有参数的erlang中运行命令的主要内容,如果未能解决你的问题,请参考以下文章

通过控制台在已经运行的 shell 中运行 erlang shell 命令

带有命令行参数的 Autohotkey 脚本运行程序

如何用gdb调试erlang运行期

无法使用 Symfony 进程运行带有参数的 Laravel Artisan 命令 [重复]

从带有命令行参数的批处理文件运行控制台应用程序,如何在运行时传递参数值? [复制]

在Java中运行带有前置参数的exe [关闭]