Существует несколько способов сделать это, например, вы можете реализовать его самостоятельно в 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 называется выполнить(), если выполнить не существует в текущей среде, то в 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
Есть ли причина, что вы не можете написать эту функцию как функцию Java, а затем предоставить эту функцию для LuaJ? – Bobby