【发布时间】:2016-04-05 07:07:08
【问题描述】:
我想简单地从LuaJ 执行一个linux terminal command 像 ls 并且它将返回的结果或任何返回的结果我想接收它并将在@987654324 中显示名称@。我搜索但找到了this,但没有找到LuaJ。
有什么函数可以从 LuaJ 执行终端命令吗?
【问题讨论】:
-
是否有理由不能将此功能编写为 Java 函数,然后将该函数提供给 LuaJ?
我想简单地从LuaJ 执行一个linux terminal command 像 ls 并且它将返回的结果或任何返回的结果我想接收它并将在@987654324 中显示名称@。我搜索但找到了this,但没有找到LuaJ。
有什么函数可以从 LuaJ 执行终端命令吗?
【问题讨论】:
有多种方法可以做到这一点,其中一种是您可以自己用 Java 实现它,然后将其链接到 LuaJ。
LuaFunction command = new OneArgFunction()
{
public LuaValue call(LuaValue cmd)
{
Process p = Runtime.getRuntime().exec("/bin/sh", "-c", cmd.checkstring());
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
int returnCode = p.waitFor();
return LuaValue.valueOf(returnCode);
}
}
globals.set("command", command);
然后在 Lua 中:
local code = command("ls");
实际获取命令输出的问题在于,您不能只拥有一个固定的解决方案。就系统所知,您可能正在调用一个运行 2 小时的程序,生成恒定的输出,这可能是一个问题,更不用说程序是否需要输入。如果你知道你只会使用某些函数,你可以制作上述函数的脏版本来捕获流的输出并将其全部返回而不是退出代码,只是不要在其他不使用它的进程上使用它t 快回来。另一种选择是创建一个类,该类包装来自进程的输入和输出流并返回该类的强制版本,并管理来自 lua 的输入和输出。
Lua 确实有一个属于 OsLib 的函数,称为 execute(),如果在当前环境中不存在 execute,则在 Java 调用中:
globals.load(new OsLib());
在加载 lua 代码之前。 os.execute() 函数返回状态码,并且不返回流,因此无法在那里获取输出。为了解决这个问题,您可以修改命令以将输出通过管道传输到临时文件并使用 io 库打开它(如果当前环境中不存在新的 IoLib())。
另一个选项是使用 io.openProcess,它也执行命令并返回一个文件以从中读取输出。
资源:
【讨论】: