我只想执行一个类似ls fromlinux terminal command
的LuaJ
命令,它将返回的结果或返回的任何内容,我想接收它并在Java Gui
中显示名称。我搜索但发现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);
然后在卢阿:
local code = command("ls");
实际获得命令输出的问题是,不能只使用fixall解决方案。尽管系统知道你可以调用一个运行2小时产生恒定输出的程序,这可能是个问题,更不用说程序是否需要输入了。如果你知道你只需要使用某些函数,你可以制作一个脏函数上面的函数来捕获流的输出并返回它,而不是退出代码,只是不要在其他不快速返回的进程上使用它。另一种方法是创建一个类,该类包装来自进程的输入和输出流,并返回该类的强制版本,并管理来自lua的输入和输出。
Lua确实有一个函数,称为ExcUTE()的一部分,如果当前环境中不存在执行,那么Java调用:
globals.load(new OsLib());
在加载lua代码之前。函数的作用是:返回状态码,而不返回流,因此无法获得输出。为了解决这个问题,您可以修改命令以将输出管到一个临时文件,并用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