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