Я хочу реализовать индикатор выполнения, показывающий прошедшие секунды в bash. Для этого мне нужно стереть последнюю строку, показанную на экране (команда «очистить» стирает весь экран, но мне нужно стереть только строку индикатора выполнения и заменить ее новой информацией).
Окончательный результат должен выглядеть так:
$ Elapsed time 5 seconds
Затем через 10 секунд я хочу заменить это предложение (в той же позиции на экране) на:
$ Elapsed time 15 seconds
for i in {1..100000}; do echo -en "\r$i"; done
чтобы избежать вызова seq :-)Сам по себе возврат каретки перемещает курсор только в начало строки. Это нормально, если каждая новая строка вывода по крайней мере такая же, как и предыдущая, но если новая строка короче, предыдущая строка не будет полностью перезаписана, например:
Чтобы фактически очистить строку для нового текста, вы можете добавить
\033[K
после\r
:http://en.wikipedia.org/wiki/ANSI_escape_code
источник
\e[K
вместо\033[K
.\033[G
io и\r
раньше,\033[K
хотя, очевидно,\r
это намного проще. Также invisible-island.net/xterm/ctlseqs/ctlseqs.html дает больше подробностей, чем Википедия, и от разработчика xterm.Ответ Дерека Вейта работает хорошо, если длина строки никогда не превышает ширину терминала. Если это не так, следующий код предотвратит нежелательный вывод:
перед тем, как строка будет написана впервые, выполните
который сохраняет текущую позицию курсора. Теперь, когда вы хотите напечатать свою строку, используйте
чтобы сначала вернуться в сохраненную позицию курсора, затем очистить экран от курсора до низа и, наконец, записать результат.
источник
tput sc # save cursor echo '' > sessions.log.json while [ 1 ]; do curl 'http://localhost/jolokia/read/*:type=Manager,*/activeSessions,maxActiveSessions' >> sessions.log.json echo '' >> sessions.log.json cat sessions.log.json | jq '.' tput rc;tput el # rc = restore cursor, el = erase to end of line sleep 1 done
tput ed
а неtput el
. Использовался пример @Umed
(возможно, он исправил его после того, как вы прокомментировали).Метод \ 033 у меня не сработал. Метод \ r работает, но на самом деле ничего не стирает, а просто помещает курсор в начало строки. Итак, если новая строка короче старой, вы можете увидеть оставшийся текст в конце строки. В конце концов, путь был лучшим выходом. У него есть и другие варианты использования, помимо курсора, плюс он предустановлен во многих дистрибутивах Linux и BSD, поэтому должен быть доступен для большинства пользователей bash.
Вот небольшой сценарий обратного отсчета, с которым можно поиграть:
источник
В случае, если вывод выполнения является многострочным или скрипт уже распечатал символ новой строки, вы можете перескакивать на строки с помощью чего-то вроде:
printf "\033[5A"
что заставит курсор прыгнуть на 5 строк вверх. Затем вы можете перезаписать все, что вам нужно.
Если это не сработает, вы можете попробовать
printf "\e[5A"
илиecho -e "\033[5A"
, что должно иметь тот же эффект.По сути, с помощью escape-последовательностей вы можете управлять практически всем на экране.
источник
tput cuu 5
где 5 - это количество строк (cuu
для перемещения вверх,cud
для перемещения вниз).Используйте символ возврата каретки:
источник
Этого можно добиться, поместив возврат каретки
\r
.В одной строке кода с
printf
или с
echo -ne
источник