2016-04-05 1 views
0

Je veux simplement exécuter un linux terminal command comme ls de LuaJ et le résultat qu'il reviendra ou tout ce qui renvoie je veux le recevoir et affichera les noms dans le Java Gui. J'ai cherché mais trouvé this mais pas un avec LuaJ.
Comment exécuter une commande de terminal Linux depuis LUAJ?

Y a-t-il une fonction pour exécuter la commande de terminal de LuaJ ??

+0

Y at-il une raison que vous ne pouvez pas écrire cette fonctionnalité en fonction Java, puis fournir cette fonction à LuaJ? – Bobby

Répondre

0

Il y a plusieurs façons de le faire, pour un, vous pouvez l'implémenter vous-même en Java, puis le lier à 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); 

Puis, en Lua:

local code = command("ls"); 

Le problème en fait obtenir la sortie d'une commande est que vous ne pouvez pas avoir juste une solution fixall. Pour tout le système sait que vous pourriez appeler un programme qui fonctionne pendant 2 heures générant une sortie constante, ce qui pourrait être un problème, pour ne pas mentionner si le programme nécessite une entrée. Si vous savez que vous allez utiliser certaines fonctions, vous pouvez créer une version sale de la fonction above pour capturer la sortie du flux et la renvoyer à la place du code de sortie, mais ne l'utilisez pas sur d'autres processus t retour rapide. L'autre alternative consiste à créer une classe qui enveloppe les flux d'entrée et de sortie du processus et renvoie une version contrainte de cette classe, et gère les entrées et les sorties de lua.

Lua a une fonction qui fait partie de la OSLib appelé execute(), si l'exécution n'existe pas dans votre environnement actuel, puis dans l'appel Java:

globals.load(new OsLib()); 

Avant de charger le code Lua. La fonction os.execute() renvoie le code d'état, et ne renvoie pas les flux, donc aucun moyen d'obtenir la sortie là. Pour contourner cela, vous pouvez modifier la commande pour diriger la sortie vers un fichier temporaire et l'ouvrir avec la bibliothèque io (new IoLib() si elle n'existe pas dans l'environnement actuel).

L'autre option consiste à utiliser io.openProcess, qui exécute également la commande et renvoie un fichier pour lire la sortie.

Ressources:

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