2012-09-27 22 views
7

See einen Blick auf diese beiden Linientcl exec zu stdout Bedarf umgeleitet Ergebnis zu zu speichernden

Fall 1

set cvsUpdStr [exec cvs -qn upd] 

Fall 2

set cvsUpdStr [exec cvs -qn upd >&@stdout] 

Zum ersten Der Fall cvsUpdStr ist die Ausgabe des Befehls, aber während der Befehlsausführung wird nichts ausgedruckt. Für den zweiten Fall wird die Befehlsausgabe cvs upd auf dem Bildschirm gedruckt, aber cvsUpdStr ist leer. Wie man sie kombiniert, so dass es das Ergebnis von cvs upd ausdrucken wird und auch die gleiche Ausgabe in cvsUpdStr Variable speichert?

+0

Wenn Sie besonders interessiert an CVS sind die Dinge, Vielleicht sehen Sie sich tkcvs an, da es die meisten CVS-Befehle bereits mit Tcl umschließt. http://tksvn.tigris.org/source/browse/tksvn/trunk/tkcvs/ – schlenk

Antwort

4

Es gibt zwei Möglichkeiten. Entweder führen Sie es als eine Pipeline (erstellt mit open |...) und behandeln die Nachrichten, wie sie eingehen, indem Sie sie speichern und drucken, oder verwenden Sie das Unix tee Dienstprogramm. Die zweite Alternative ist definitiv einfacher!

# I like to spell out “update” in full 
set cvsUpdStr [exec cvs -qn update | tee /dev/tty] 

Das tee Programm sendet seine Standardeingabe in der normalen Standardausgabe plus der angegebenen Datei; Wir verwenden /dev/tty, um es an das aktuelle Terminal zu senden.

Beachten Sie jedoch, dass die Ausgabe von cvs aufgrund der Pufferung der Ausgabe möglicherweise zu langen Verzögerungen führt. Dies ist nur das Standardverhalten der E/A-Verarbeitung der C-Bibliothek beim Senden der Ausgabe an ein Nicht-Terminal und kann ein Problem darstellen, wenn Sie die Ausgabe sofort benötigen. Dies zu beheben ganz einlässt (Sie am Ende mit Expect) also, wenn Sie zufrieden mit dem Ausgang stoßweise sein, es einfach in Ruhe lassen ...


Auf Windows, müssen Sie es in die andere Richtung zu tun.

set pipe [open |[list cvs -qn update] "r"] 
while {[gets $pipe line] >= 0} { 
    append cvsUpdStr "$line\n" ;# Note the \n at the end! 
    puts $line 
} 
close $pipe      ;# Any errors turn up here! 

Das Konstrukt mit |[list ...] ist eher ungewöhnlich in Tcl Bedingungen, aber es ist der richtige in dieser Situation zu verwenden. (Wenn das erste Zeichen des „Dateiname“ zu open ein | ist, die Rest des Arguments als eine Liste von Argumenten behandelt wird, für den Bau einer Pipeline zu verwenden.)

+0

Ich bin auf Witwen, über Tee wusste ich, aber es hilft hier nicht :( – Narek

+0

Was ist die Lösung mit 'open | .. . "? – Narek

+0

@Narek Versuchen Sie die aktualisierte Version. –