我只想从linux terminal command中执行一个像ls那样的LuaJ,它将返回的结果或任何返回的东西,我都想接收它,并在Java Gui中显示名称。我搜索了一下,但没有找到this和LuaJ。
是否有从LuaJ ??执行终端命令的函数?
发布于 2016-08-23 05:16:49
有多种方法可以做到这一点,例如,您可以自己实现它,然后将它链接到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");实际获取命令输出的问题是,您不能只得到一个固定的解决方案。因为系统都知道,您可以调用一个运行了2个小时的程序,生成恒定的输出,这可能是一个问题,更不用说程序是否需要输入了。如果您知道只使用特定的函数,那么您可以对上面的函数做一个肮脏的版本来捕获流中的输出并返回所有输出,而不是退出代码,只是不要在其他不能快速返回的进程上使用它。另一种选择是创建一个类,该类封装来自流程的输入和输出流,并返回该类的强制版本,并管理来自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
https://stackoverflow.com/questions/36419404
复制相似问题