2011-01-21 16 views
19

Uruchomiłem programy wiersza polecenia, które wyprowadzają linię, a następnie aktualizują tę linię chwilę później. Ale z rubinem mogę wydać tylko linię, a potem kolejną.Zapisywanie wcześniejszych wierszy wyjściowych w wierszu polecenia przy użyciu ruby ​​

wyjście Co mam być teraz:

Downloading file: 
11MB 294K/s 
12MB 307K/s 
14MB 294K/s 
15MB 301K/s 
16MB 300K/s 
Done! 

I zamiast, chcę to zobaczyć:

Downloading file: 
11MB 294K/s 

Obserwowani chwilę później przez to:

Downloading file: 
16MB 300K/s 
Done! 

Linia moje wyniki skryptu ruby ​​pokazujące pobrany rozmiar pliku i szybkość transferu byłyby zastępowane za każdym razem zamiast listy zaktualizowane wartości jako zupełnie nowa linia.

Obecnie używam puts do generowania wyników, co oczywiście nie jest przeznaczone dla tego przypadku. Czy istnieje inna metoda wyjścia, która może osiągnąć ten wynik?

Odpowiedz

38

Użyj \r, aby przesunąć kursor na początek linii. I nie powinieneś używać puts, ponieważ dodaje on \n, zamiast tego użyj print. Tak:

print "11MB 294K/s" 
print "\r" 
print "12MB 307K/s" 

Jedną rzeczą, aby pamiętać, iż: \r nie usuwać nic, to po prostu cofa kursor, więc trzeba by pad wyjście ze spacjami nadpisać poprzednią wyjścia (na wypadek, gdyby był dłuższy).

Domyślnie po wydrukowaniu \n na standardowe wyjście bufor jest płukany. Teraz może być konieczne użycie STDOUT.flush po print, aby upewnić się, że tekst zostanie wydrukowany od razu.

+1

To rozwiązanie nie pokazuje wyjścia, dopóki nie zostanie wyprowadzony znak nowej linii lub program się kończy. Ten przykład, na przykład 'print '123', sleep 5; drukuj "\ r"; print "456" 'nie drukuje niczego na początku, a następnie drukuje" 456 "5 sekund później. Więc niewiele mi to pomaga. –

+1

Dodaj 'STDOUT.flush', aby natychmiast wysłać go do wyjścia. Również zaktualizowałem odpowiedź. – detunized

+0

Ahhhh to ma sens. To naprawione i działa teraz świetnie, dziękuję! –

Powiązane problemy