Таким образом, когда вы wget
получаете веб-страницу, она показывает вам строку состояния, в которой указано, сколько файлов загружено / загружено. Это выглядит так:
25%[=============>______________________________________] 25,000 100.0K/s
(подчеркивания - пробелы; я просто не могу понять, как получить более одного последовательного пробела)
Однако вместо того, чтобы записать еще одну строку в стандартный вывод и добавить еще один индикатор выполнения, он обновляет ее следующим образом:
50%[===========================>________________________] 50,000 100.0K/s
И wget
это не единственный пример этого. Например, когда вы отправляете что-то в less
и затем выходите, ваше исходное приглашение все еще там, вместе с результатом любых команд, которые вы выполняли ранее. Как будто ты никогда не уходил.
Итак, мои вопросы: как это называется, как мне это реализовать, работает ли это только для одной строки за раз, и могу ли я использовать это в C?
Ответы:
Прежде всего, ваш вопрос не имеет ничего общего с bash, а с терминалом. Терминал отвечает за отображение текста программ, а сам bash не контролирует программы после их запуска.
Терминалы предлагают последовательности управления для управления цветом, шрифтом, положением курсора и многим другим. Для получения списка стандартизированных терминальных последовательностей посмотрите на http://www.termsys.demon.co.uk/vtansi.htm. Вы можете, например,
создать индикатор выполнения.
Более продвинутые escape-последовательности терминала обычно зависят от терминала, например, работают только с Eterm или xterm. ncurses - это библиотека программирования, которая позволяет создавать интерактивные программы с помощью терминала, чтобы вам не приходилось использовать escape-последовательности.
Как перезаписать существующую строку терминальными последовательностями
Как перезаписать существующую строку без последовательности терминала
Одно простое решение - не писать новую строку в конце, а записывать возврат каретки, который в основном сбрасывает курсор в начало строки, например:
\r
Или возврат каретки будет поместить курсор в начало строки и позволяет перезаписать содержимое строки.Переключаться между буферами как
less
илиvi
Поведение
less
также связано с более продвинутой функцией терминала, альтернативным экраном:В http://rosettacode.org/wiki/Terminal_control/Preserve_screen приведен пример того, как сделать это самостоятельно, через tput или через некоторые escape-последовательности.
источник
Вместо использования
echo
которого автоматически добавляется новая строка в строку, используйтеprintf "%s\r" whatever
- возврат каретки отправляет курсор в начало текущей строки. пример:источник
printf "\r%2d " $num