2012-09-27 14 views
7

jezioro spojrzeć na tych dwóch liniachTCL Exec Wynik przekierowany na stdout muszą być przechowywane zbyt

case 1

set cvsUpdStr [exec cvs -qn upd] 

przypadek 2

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

dla pierwszego case cvsUpdStr to dane wyjściowe polecenia, ale nic nie jest drukowane podczas wykonywania polecenia. W drugim przypadku dane wyjściowe polecenia cvs upd są drukowane na ekranie, ale cvsUpdStr jest puste. Jak je połączyć, aby wydrukować wynik cvs upd, a także zapisać to samo wyjście w zmiennej cvsUpdStr?

+0

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

Odpowiedz

4

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

+0

Jestem na wdowach, o koszulce, którą znałem, ale to nie pomaga tutaj :( – Narek

+0

Jakie jest rozwiązanie z 'open | .. .? – Narek

+0

@Narek Wypróbuj zaktualizowaną wersję –

Powiązane problemy