Ich verwende es svn export
als Teil eines Packager-Skripts für meine Anwendung und es sieht so aus, als ob dieser Befehl, wie viele andere auch, keinerlei Fortschrittsbalken hat.
Ich habe im Moment zwei Möglichkeiten:
- Verwenden Sie es ohne Optionen und sehen Sie zu, wie es Tausende von Zeilen druckt
- verwenden
--quiet
und nichts sehen, bis es abgeschlossen ist.
Gibt es eine Möglichkeit, zumindest die Anzahl der vom Befehl ausgegebenen Zeilen in Echtzeit anzuzeigen? Zum Beispiel:
Exporting SVN directory ... 1234 files
Und sehen Sie diese Nummer1234
Inkrement in Echtzeit? Ich kann mir vorstellen, die Ausgabe an einen Befehl weiterzuleiten, der genau dies tut, aber an welchen?
Antwort1
yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }
Oder fügen Sie den eingeklammerten Abschnitt in ein Shell-Skript ein. Beachten Sie, dass dies nur funktioniert, wenn Ihre Shell den Präinkrementoperator tatsächlich unterstützt, wie z. B. Bash oder Ksh93 oder Zsh. Andernfalls müssen Sie inkrementieren $I
und dann drucken (wie in I=$((I+1));printf...
). Wenn printf
es in Ihrer Shell nicht integriert ist (es ist in der aktuellen Bash integriert), können Sie stattdessen echo -ne
oder verwenden print -n
, um eine bessere Leistung zu erzielen. Sie möchten nur die neue Zeile unterdrücken und \r als Escape-Zeichen interpretieren lassen.
Antwort2
Dies ist nur eine grobe Vorstellung, aber Sie könnten den pv
Befehl verwenden, um die Anzahl der vorbeilaufenden Zeilen zu zählen und dies auf dem Bildschirm anzuzeigen. pv
Unter den vielen Schaltern befindet sich einer -l
, der jede durchlaufende Zeile zählt.
Beispiel
Hier verwende ich eine While-Schleife, um einige Dateien aus Ihrer SVN-Ausgabe zu simulieren.
$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
3 0:00:05 [0.99/s ] [ <=>
Die Ausgabezeile wird weiterhin wie folgt überschrieben:
18 0:00:36 [ 0/s ] [ <=> ]
24 0:00:47 [0.991/s ] [ <=> ]
Antwort3
Sie können Ihren Befehl als Job im Hintergrund ausführen und seine Standardausgabe (und optional auch die Standardfehlerausgabe) in eine Protokolldatei umleiten: command > logfile &
wobei &
„Job“ bezeichnet (wenn auch die Standardfehlerausgabe, sagen Sie „ &>
anstelle von >
“).
Anschließend können Sie das Dienstprogramm „Wordcount“ verwenden, um die Anzahl der Zeilen in Ihrer Protokolldatei zu zählen wc -l
.
Um die Statusänderung in einer sich dynamisch ändernden Zeile anzuzeigen, könnten Sie etwas wie verwenden while true; do echo -en '\r'; wc -l logfile; sleep 1; done
, aber ich kann Bash nicht zwingen, \r
einen Wagenrücklauf anzuzeigen, um den Inhalt der vorherigen Zeile zu löschen.
Sehen Sie sich diese Frage an, es ist fast ein Duplikat:https://stackoverflow.com/questions/2388090/wie-lösche-und-ersetze-man-die-letzte-zeile-im-terminal-mit-bash