Я использую svn export
как часть сценария упаковщика для своего приложения, и похоже, что эта команда, как и многие другие, не имеет какого-либо индикатора выполнения.
У меня есть два варианта на данный момент:
- используя его без параметров, и смотрите, печатая тысячи строк
- используя
--quiet
, и не оставляя ничего, пока не завершится.
Есть ли способ, по крайней мере, показать количество строк, выводимых командой, в режиме реального времени? Такие как:
Exporting SVN directory ... 1234 files
И увидеть это 1234
увеличение числа в реальном времени ? Я могу себе представить вывод команды в команду, которая будет делать именно это, но какую?
источник
=
и `=` различиями и причудами. :) Почему бы не заменить его языком, похожим на синтаксис Python ...printf
заканчивается с\r
. И что произойдет, если вы делаетеecho -ne "$I\r"
илиprint -n "$I\r"
. :) Я использовалprintf
, однако, потому что по умолчанию он не печатает новую строку в конце, поэтому\r
просто возвращается к началу. К сожалению, не все реализации echo поддерживают аргумент-e
or-n
.read
наread -r
(так как в противном случае обратный слеш в конце строки будет мешать подсчету). Кстати, немного поработав, это может быть адаптировано для отображения последней строки вывода, что может быть полезно для некоторых команд.Это грубая идея, но вы можете использовать
pv
команду для подсчета количества строк по мере их прохождения и отображения на экране.pv
среди множества переключателей есть-l
переключатель, который считает каждую строку по мере прохождения.пример
Здесь я использую цикл while для имитации некоторых файлов из вашего SVN-вывода.
Он будет перезаписывать строку вывода следующим образом:
источник
Вы можете запустить свою команду в фоновом режиме как задание и перенаправить ее стандартный вывод (и, возможно, stderr) в файл журнала:
command > logfile &
где&
обозначает задание (если и stderr, скажем,&>
вместо>
).Затем вы можете использовать утилиту wordcount для подсчета количества строк в вашем лог-файле
wc -l
.Чтобы показать изменение состояния в одной динамически изменяющейся строке, вы можете использовать что-то вроде этого
while true; do echo -en '\r'; wc -l logfile; sleep 1; done
, но я не могу заставить bash нарисовать\r
возврат каретки, чтобы уничтожить содержимое предыдущей строки.Посмотрите на этот вопрос, это почти дубликат: /programming/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash
источник
printf/print/echo
предложенными Дэнни. :) Конечно, он мог бы использоватьless
, но я полагаю, он может позволить себе говоритьwc -l logfile
каждый раз, когда он становится нетерпеливым. Я думаю, что игра сncurses
или очистка экрана - это перебор.echo -e 'r'
команду? Он должен стереть ранее напечатанное содержимое строки, чтобы он динамически изменялся, но я не могу заставить его это сделать :(