org - lua roblox
Obtener el estado de retorno Y la salida del programa (5)
Necesito usar Lua para ejecutar un programa binario que puede escribir algo en su stdout y también devuelve un código de estado (también conocido como " estado de salida ").
Busqué en la web y no pude encontrar algo que haga lo que necesito. Sin embargo, descubrí eso en Lua:
-
os.execute()
devuelve el código de estado -
io.popen()
devuelve un controlador de archivos que se puede utilizar para leer la salida del proceso
Sin embargo, necesito ambos. Escribir una función de envoltura que ejecute ambas funciones detrás de la escena no es una opción debido a la sobrecarga del proceso y posiblemente a los cambios en el resultado en ejecuciones consecutivas. Necesito escribir una función como esta:
function run(binpath)
...
return output,exitcode
end
¿Alguien tiene una idea de cómo se puede resolver este problema?
PD. el sistema objetivo sonó Linux.
Con LUA 5.2 puedo hacer lo siguiente y funciona
-- This will open the file
local file = io.popen(''dmesg'')
-- This will read all of the output, as always
local output = file:read(''*all'')
-- This will get a table with some return stuff
-- rc[1] will be true, false or nil
-- rc[3] will be the signal
local rc = {file:close()}
Espero que esto ayude...
Esta funcionalidad se proporciona en C por pclose
.
Tras el retorno exitoso, pclose () devolverá el estado de terminación del intérprete de idioma de comando.
El intérprete devuelve el estado de terminación de su hijo.
Pero Lua no hace esto bien ( io.close
siempre vuelve verdadero). No he profundizado en estos hilos, pero algunas personas se quejan de este daño cerebral.
No puedo usar Lua 5.2, uso esta función auxiliar.
function execute_command(command)
local tmpfile = ''/tmp/lua_execute_tmp_file''
local exit = os.execute(command .. '' > '' .. tmpfile .. '' 2> '' .. tmpfile .. ''.err'')
local stdout_file = io.open(tmpfile)
local stdout = stdout_file:read("*all")
local stderr_file = io.open(tmpfile .. ''.err'')
local stderr = stderr_file:read("*all")
stdout_file:close()
stderr_file:close()
return exit, stdout, stderr
end
Si está ejecutando este código en Win32 o en un entorno POSIX, puede probar esta extensión de Lua: http://code.google.com/p/lua-ex-api/
Alternativamente, podría escribir un pequeño script de shell (suponiendo que bash o similar esté disponible) que:
- ejecuta el ejecutable correcto, capturando el código de salida en una variable de shell,
- imprime una nueva línea y un carácter / cadena de terminal en una salida estándar
- imprime el valor de las variables del caparazón (el código de salida) en una salida estándar
Luego, capture toda la salida de io.popen y analice al revés.
Divulgación completa: no soy un desarrollador de Lua.
sí, tienes razón en que os.execute()
tiene devoluciones y es muy simple si entiendes cómo ejecutar tu comando con y sin lua, también querrás saber cuántas variables devuelve, y puede llevar un tiempo, pero creo que puedes probar
local a, b, c, d, e=os.execute(-what ever your command is-)
para mi ejemplo a es un primer argumento devuelto, b es el segundo argumento devuelto, y etc. Creo que respondí correctamente a su pregunta, en función de lo que está preguntando.