2008-09-25 7 views
37

Wenn ich ein "os.execute" in Lua mache, erscheint eine Konsole schnell, führt den Befehl aus und schließt dann. Gibt es eine Möglichkeit, die Konsolenausgabe nur mit den Standard-Lua-Bibliotheken wiederherzustellen?Holen Sie die Ausgabe von os.execute in Lua zurück

+2

danke für die Frage, war die gleiche Sache heute fragen –

Antwort

1

Ich weiß nicht, über Lua speziell aber Sie können so im Allgemeinen einen Befehl ausführen:

comd >comd.txt 2>&1 

die Ausgabe und Fehler in der Datei comd.txt zu erfassen, verwenden Sie dann die Sprachen Datei-I/O-Funktionen um es einzulesen.

So würde ich es machen, wenn die Sprache selbst nicht für die Erfassung von Stanard-Ausgabe und -Fehler sorgen würde.

+0

Dies ist Windows-spezifische, aber ist eine Methode, die für mich gelöst. Ein Beispiel für eine ganze Befehlszeichenkette, die zum Ausführen übergeben wird, ist "cmd.exe/c c: \ ppttoit \ someprogram.exe -arg1 somefile> c: \ temp \ out.txt 2> & 1". Der 2> Teil war der Trick für mich. – jdr5ca

+0

Dies ist nicht Windows-spezifisch. Es wird auch unter Unix, Linux, BSD, OS X und vielen anderen Systemen funktionieren. Ich bin nicht der größte Fan von frivolen temporären Dateien, also mag ich diesen Ansatz nicht, obwohl es technisch funktioniert. Der '2> & 1'Teil lenkt den Standardfehler (Ausgang 2) auf den Standardausgang (Ausgang 1) um, der bereits auf comd.txt umgeleitet wurde ('> 'ist Kurzschrift für' 1> ') –

47

Wenn Sie IO.popen haben, dann ist das, was ich benutze.

 
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 

Wenn Sie nicht IO.popen, dann vermutlich popen (3) nicht verfügbar auf Ihrem System und Sie sind in tiefem Joghurt. Aber alle Unix/Mac/Windows Lua Ports werden io.popen haben.

+0

Haben Sie ein Beispiel dafür das oben genannte verwenden? – starbeamrainbowlabs

+1

Ich benutzte dies, um prozentuale Leistung für einige proprietäre UPS Software zu erhalten 'local curPercent = os.capture (" sudo pwrstat -status | grep 'Batteriekapazität' | cut -d '' -f 3 ", false) - stelle sicher, dass du eine Regel in/etc/sudoers hast, um diese pwrstat ohne Passwort auszuführen (NOPASSWD) ' Ich habe die zweite Option der os.capture-Funktion oben auf' false' gesetzt, so dass sie den Newline-Befehl wie gewohnt ausschaltet bekommen. – Logg