Istnieją dwie możliwości. Uruchom go jako potok (utworzony przy użyciu open |...
) i postępuj według odebranych wiadomości, przechowując je i drukując, lub użyj narzędzia Unix tee
. Druga alternatywa jest zdecydowanie prostsza!
# I like to spell out “update” in full
set cvsUpdStr [exec cvs -qn update | tee /dev/tty]
Program tee
wysyła swoje standardowe wejście do normalnego standardowego wyjścia plus nazwie pliku; używamy /dev/tty
, aby wysłać go do bieżącego terminalu.
Pamiętaj jednak, że możesz uzyskać duże opóźnienie w wyjściu z cvs
, ponieważ buforuje to wyjście. Jest to domyślne zachowanie obsługi operacji we/wy biblioteki C podczas wysyłania danych wyjściowych do nie-terminala i może stanowić problem, jeśli potrzebujesz natychmiastowego wyjścia. Mocowanie to robi się dość zaangażowany (kończy się przy użyciu Expect), więc jeśli jesteś zadowolony z wyjście jest impulsowy, po prostu zostawić go w spokoju ...
W systemie Windows, trzeba to zrobić w inny sposób.
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!
Konstrukt z |[list ...]
jest raczej nietypowe pod względem Tcl, ale jest to poprawne użycie w tej sytuacji. (Jeżeli pierwszy znak „filename” do open
jest |
The reszta argumentu traktowana jest jako lista argumentów użyć do budowy rurociągu.)
Jeśli jesteś szczególnie zainteresowany rzeczy CV możesz rzucić okiem na tkcvs, ponieważ już zawija większość poleceń CVS przy pomocy Tcl. http://tksvn.tigris.org/source/browse/tksvn/trunk/tkcvs/ – schlenk