2008-09-25 13 views
37

Cuando hago un "os.execute" en Lua, una consola aparece rápidamente, ejecuta el comando y luego se cierra. Pero, ¿hay alguna forma de recuperar la salida de la consola solo con las bibliotecas Lua estándar?Obtenga la salida de os.execute en Lua

+2

gracias por preguntar esto, me preguntaba lo mismo hoy –

Respuesta

1

No sé sobre Lua específicamente, pero en general se puede ejecutar un comando como:

comd >comd.txt 2>&1 

capturar la salida y el error a la comd.txt archivo, a continuación, utilizar el archivo de idiomas funciones de E/S para leerlo.

Así es como lo haría si el idioma en sí no proporcionara la captura de la producción estándar y el error.

+0

Esto es específico de Windows pero es un método que he resuelto para mí. Un ejemplo de cadena de comando completa pasada para ejecutar es "cmd.exe/c c: \ pathtoit \ someprogram.exe -arg1 somefile> c: \ temp \ out.txt 2> & 1". La parte 2> fue el truco para mí. – jdr5ca

+0

Esto no es específico de Windows. También funcionará en Unix, Linux, BSD, OS X y muchos otros sistemas. No soy el mayor fan de los archivos temporales frívolos, así que no me gusta este enfoque, aunque técnicamente funciona. La parte '2> & 1' redirige el error estándar (salida 2) a la salida estándar (salida 1), que ya fue redirigido a comd.txt ('> 'es una abreviatura de' 1> ') –

47

Si ha io.popen, entonces esto es lo que yo uso:.

 
function os.capture(cmd, raw) 
    local f = assert(io.popen(cmd, 'r')) 
    local s = assert(f:read('*a')) 
    f:close() 
    if raw then return s end 
    s = string.gsub(s, '^%s+', '') 
    s = string.gsub(s, '%s+$', '') 
    s = string.gsub(s, '[\n\r]+', ' ') 
    return s 
end 

Si usted no tiene io.popen, entonces presumiblemente popen (3) no es disponible en su sistema, y ​​usted está en yogur profundo. Pero todos los puertos Lua de unix/mac/windows tendrán io.popen.

+0

¿Tiene un ejemplo de cómo para usar lo anterior? – starbeamrainbowlabs

+1

Lo usé para obtener el porcentaje de energía restante para algún software propietario de UPS 'local curPercent = os.capture (" sudo pwrstat -status | grep 'Capacidad de la batería' | cut -d '' -f 3 ", falso) - asegúrese de tener una regla en/etc/sudoers para ejecutar este pwrstat sin contraseña (NOPASSWD) ' Tengo la segunda opción de la función os.capture anterior establecida en' false' para que se elimine la nueva línea que normalmente obtener. – Logg