0

我想简单地执行一个linux terminal command类似的ls fromLuaJ以及它将返回的结果或任何返回的我想接收它并将在Java Gui. 我搜索但找到了这个,但没有找到LuaJ

是否有任何功能可以从 LuaJ 执行终端命令?

4

1 回答 1

0

有多种方法可以做到这一点,其中一种方法是您可以自己用 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");

实际获取命令输出的问题在于,您不能只拥有一个 fixall 解决方案。就系统所知,您可能正在调用一个运行 2 小时的程序,生成恒定的输出,这可能是一个问题,更不用说程序是否需要输入。如果你知道你只会使用某些函数,你可以制作上述函数的脏版本来捕获流的输出并将其全部返回而不是退出代码,只是不要在其他不使用它的进程上使用它t 快回来。另一种选择是创建一个类,该类包装来自进程的输入和输出流并返回该类的强制版本,并管理来自 lua 的输入和输出。

Lua 确实有一个函数,它是 OsLib 的一部分,称为 execute(),如果在当前环境中不存在执行,则在 Java 调用中:

globals.load(new OsLib());

在加载 lua 代码之前。os.execute() 函数返回状态码,并且不返回流,因此无法在那里获取输出。要解决此问题,您可以修改命令以将输出通过管道传输到临时文件并使用 io 库打开它(如果当前环境中不存在新的 IoLib())。

另一种选择是使用 io.openProcess,它也执行命令并返回一个文件以从中读取输出。

资源:

http://luaj.org/luaj/3.0/api/org/luaj/vm2/lib/OsLib.html

http://luaj.org/luaj/3.0/api/org/luaj/vm2/lib/IoLib.html

于 2016-08-23T05:16:49.023 回答