Używam svn export
jako części skryptu programu pakującego dla mojej aplikacji i wygląda na to, że to polecenie, podobnie jak wiele innych, nie ma żadnego paska postępu.
W tej chwili mam dwie możliwości:
- używając go bez opcji i obserwuj, jak drukuje tysiące linii
- używając
--quiet
i nie widząc niczego, dopóki się nie zakończy.
Czy istnieje sposób, aby przynajmniej pokazywać liczbę wierszy wyprowadzanych przez polecenie w czasie rzeczywistym? Jak na przykład:
Exporting SVN directory ... 1234 files
I widzisz ten 1234
przyrost liczby w czasie rzeczywistym ? Mogę sobie wyobrazić przesyłanie danych wyjściowych do polecenia, które by to zrobiło, ale które?
źródło
=
różnicami i dziwactwami `=`. :) Dlaczego nie zastąpiliby go językiem składniopodobnym jak python ...printf
kończy się na\r
. A co się stanie, jeśli to zrobiszecho -ne "$I\r"
lubprint -n "$I\r"
. :) Użyłemprintf
jednak, ponieważ domyślnie nie drukuje nowego wiersza na końcu, więc po\r
prostu wraca do początku. Niestety nie wszystkie implementacje echa obsługują argument-e
lub-n
.read
naread -r
(ponieważ w przeciwnym razie odwrotny ukośnik na końcu linii zakłóciłby liczenie). Nawiasem mówiąc, przy odrobinie pracy można to dostosować, aby wyświetlać również najnowszą linię danych wyjściowych, co może być przydatne w przypadku niektórych poleceń.To trudny pomysł, ale możesz użyć tego
pv
polecenia, aby policzyć liczbę linii w ruchu i wyświetlić je na ekranie.pv
wśród wielu przełączników znajduje się-l
przełącznik, który zlicza każdą linię w miarę jej przechodzenia.Przykład
Tutaj używam pętli while do symulacji niektórych plików z wyjścia SVN.
Nadpisuje linię wyjściową w następujący sposób:
źródło
Możesz uruchomić swoje polecenie w tle jako zadanie i przekierować jego stdout (i opcjonalnie stderr) do pliku logu:
command > logfile &
gdzie&
oznacza zadanie (jeśli stderr też, powiedz&>
zamiast>
).Następnie możesz użyć narzędzia wordcount, aby policzyć liczbę wierszy w pliku dziennika
wc -l
.Aby pokazać zmianę stanu w jednej dynamicznie zmieniającej się linii, możesz użyć czegoś takiego
while true; do echo -en '\r'; wc -l logfile; sleep 1; done
, ale nie mogę zmusić bash do narysowania\r
powrotu karetki, aby zabić zawartość poprzedniej linii.Zobacz to pytanie, to prawie duplikat: /programming/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash
źródło
printf/print/echo
jak sugeruje Danny. :) Oczywiście, że mógłby skorzystaćless
, ale przypuszczam, że stać go na to, by powiedziećwc -l logfile
za każdym razem, gdy się niecierpliwi. Myślę, że zabawancurses
lub wyczyszczenie ekranu to tutaj przesada.echo -e 'r'
polecenia? Powinien usunąć poprzednio wydrukowaną zawartość linii, aby dynamicznie się zmieniała, ale nie mogę tego zmusić :(