2008-09-25 14 views
37

Quand je fais un "os.execute" dans Lua, une console apparaît rapidement, exécute la commande, puis se ferme. Mais existe-t-il un moyen de récupérer la sortie de la console en utilisant uniquement les bibliothèques Lua standard?Récupère la sortie de os.execute dans Lua

+2

merci de demander cela, se demandait la même chose aujourd'hui –

Répondre

1

Je ne sais pas Lua spécifiquement, mais vous pouvez généralement exécuter une commande comme:

comd >comd.txt 2>&1 

pour capturer la sortie et l'erreur dans le fichier comd.txt, puis utiliser le fichier des langues fonctions E/S pour le lire.

C'est comme ça que je le ferais si le langage lui-même ne permettait pas de capturer la sortie standard et l'erreur.

+0

Ceci est spécifique à Windows mais est une méthode qui a résolu pour moi. Un exemple de chaîne de commande entière passée à exécuter est "cmd.exe/c c: \ pathtoit \ certainprogram.exe -arg1 quelfichier> c: \ temp \ out.txt 2> & 1". La partie 2> était l'astuce pour moi. – jdr5ca

+0

Ce n'est pas spécifique à Windows. Il fonctionnera également sous Unix, Linux, BSD, OS X et beaucoup d'autres systèmes. Je ne suis pas le plus grand fan de fichiers temporaires frivoles, donc je n'aime pas cette approche, même si cela fonctionne techniquement. La partie '2> & 1' redirige l'erreur standard (sortie 2) vers la sortie standard (sortie 1), qui était déjà redirigée vers comd.txt ('> 'est un raccourci pour' 1> ') –

47

Si vous avez io.popen, alors ce que je l'utilise.

 
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 vous ne l'avez pas io.popen, puis popen probablement (3) ne disponible sur votre système, et vous êtes dans un yaourt profond. Mais tous les ports Lua d'unix/mac/windows auront io.popen.

+0

Avez-vous un exemple de comment utiliser le ci-dessus? – starbeamrainbowlabs

+1

Je l'ai utilisé pour obtenir le pourcentage d'énergie restante pour certains logiciels propriétaires de l'onduleur 'local curPercent = os.capture (" sudo pwrstat -status | grep 'Capacité de la batterie' | cut -d '' -f 3 ", false) - assurez-vous que vous avez la règle dans/etc/sudoers pour exécuter ce pwrstat sans mot de passe (NOPASSWD) ' J'ai la deuxième option de la fonction os.capture ci-dessus définie sur' false' afin qu'elle efface la nouvelle ligne normalement obtenir. – Logg