如何从LUAJ执行linux终端命令?

时间:2016-04-05 07:07:08

标签: java linux luaj

我想简单地从linux terminal command执行LuaJ类似 ls 的结果,以及返回的结果或返回的任何内容我想要接收它并显示名称在Java Gui。我搜索了this,但找不到LuaJ

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

1 个答案:

答案 0 :(得分: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小时的程序来产生恒定输出,这可能是一个问题,更不用说程序是否需要输入。如果你知道你只是要使用某些函数,你可以创建一个上面函数的脏版本来捕获流的输出并返回它而不是退出代码,只是不要在其他进程上使用它快点回来另一种方法是创建一个类,它包装来自进程的输入和输出流,并返回该类的强制版本,并管理来自lua的输入和输出。

Lua确实有一个函数,它是OsLib的一部分,名为execute(),如果当前环境中不存在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

相关问题