2011-09-30 13 views
6

Necesito usar Lua para ejecutar un programa binario que puede escribir algo en su salida estándar y también devuelve un código de estado (también conocido como "exit status").Obtener el estado de retorno Y la salida del programa

He buscado en la web y no he podido encontrar algo que haga lo que necesito. Sin embargo descubrí que en Lua:

  • os.execute() devuelve el código de estado
  • io.popen() devuelve un manejador de archivo que puede ser usado para leer de salida del proceso

Sin embargo necesito tanto. 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. Tengo que escribir una función como esta:

function run(binpath) 
    ... 
    return output,exitcode 
end 

¿Alguien tiene una idea de cómo este problema se puede solucionar?

PS. el sistema objetivo sonó Linux.

Respuesta

8

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 ...

1

Si ejecuta este código en Win32 o en un entorno POSIX, puede probar esta extensión Lua: http://code.google.com/p/lua-ex-api/

Alternativamente, se podría escribir un pequeño script de shell (suponiendo 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 el carácter de terminal/cadena en la salida estándar
  • impresiones de las variables del shell Valu e (el código de salida) en la salida estándar

Luego, capture toda la salida de io.popen y analice al revés.

Descripción completa: No soy desarrollador de Lua.

+0

Gracias. Sí, tenemos un caparazón en nuestro pequeño sistema Linux. Esta es la solución más rápida al problema. – AlexStack

+0

@AlexStack Eres bienvenido. –

2

Esta funcionalidad se proporciona en C por pclose.

En caso de devolución exitosa, 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 devuelve verdadero). No he profundizado en estos hilos, pero algunas personas se quejan de este daño cerebral.

+0

gracias por la explicación y el enlace a los hilos. – AlexStack

+0

@AlexStack Espero que encuentre una forma de evitarlo. Lua es agradable, pero el desarrollo parece lento (¡el primer hilo es del 2004!). – cnicutar

1

no puedo utilizar Lua 5.2, utilizo 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 
0

sí, su razón en que os.execute() tiene rendimientos y es muy simple si usted entiende cómo ejecutar el comando con y con lua cabo posible que también desee saber cuántas variables que vuelve, y puede ser que tome un tiempo, pero creo que se puede intentar

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 .. pienso que respondido a su pregunta correcta, con sede fuera de lo que están preguntando.

Cuestiones relacionadas