使用参数在erlang中运行命令

时间:2012-02-29 14:10:52

标签: erlang xmpp ejabberd

我正在尝试为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(< 0.423.0>:ejabberd_hooks:294):{function_clause,

然而,即使我在没有++的情况下运行它,我也会收到另一个错误,告诉我Bad Match。

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

1 个答案:

答案 0 :(得分:4)

根据您提供的少量信息,假设您使用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=#jid{user = 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 上的字段用户是一个字符串。

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


编辑您的问题并在遇到更多问题时添加更多信息,或者更清楚地说明这一点。