2016-04-05 3 views
0

Я хочу просто выполнить linux terminal command как ls от LuaJ и результат, который он вернет, или что-нибудь, что вернет, я хочу его получить и покажу имена в Java Gui. Я искал, но нашел this, но не один с LuaJ.
Как выполнить команду терминала linux от LUAJ?

Есть ли какая-либо функция для выполнения команды терминала от LuaJ ??

+0

Есть ли причина, что вы не можете написать эту функцию как функцию Java, а затем предоставить эту функцию для LuaJ? – Bobby

ответ

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 называется выполнить(), если выполнить не существует в текущей среде, то в 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

Смежные вопросы