Мой сценарий делает что-то вроде:
while :;
clear
do_a_lot_of_output_here
sleep 1
done
Есть ли варианты, чтобы экран не мигал, когда я делаю очистку и вывод? Я хочу сделать это как в watch
команде (но это написано в C
). Любые советы?
clear | hexdump -C
00000000 1b 5b 48 1b 5b 32 4a |.[H.[2J|
00000007
PS. Я пользуюсь bash
только.
clear | hexdump -C
?echo -en "\ec"
вспышка тоже?Ответы:
Перепрошивка происходит потому, что скрипт очищает весь экран. Если он закрашивает существующий текст и очищает только при необходимости, мерцание не будет.
Вот пример:
Это делает это:
ed
возможности вашего терминала для печати из текущего местоположения до конца экрана.Если вы хотите обработать экран с изменяемым размером, вы можете переместить назначения в
ROWS
иCOLS
внутри внешнего цикла, например,потому что
tput
просит текущий размер экрана из системы.Дальнейшее чтение:
terminfo
- база данных возможностей терминалаtput
,reset
- инициализация терминала или запрос TERMINFO базы данныхисточник
#!/bin/bash
и хочет использоватьwatchit
встроенные в небольшой автономный скрипт с некоторыми функциями, вы можете сделатьexport -f function_name; watchit function_name
.head
). Кажется, проблема заключается в частичной ошибке (по крайней мере, в моей настройке - ssh-сеанс в разделенных панелях, iTerm2) при вычислении количества строк.ROWS=`expr $(tput lines) - 1`
обратился к этому отлично.Один из способов предотвратить мигание - получить все выходные данные перед очисткой экрана, чтобы между очисткой и перерисовкой прошло минимальное время. Это похоже на концепцию двойной буферизации:
Это не полностью устраняет мерцание, но в моем опыте это происходит значительно реже.
источник
clear
в буфер, то естьoutput=$(clear; do_a_lot_of_output_here)
.Мигание является неизбежным результатом очистки экрана каждый раз вокруг цикла. Вы можете переместить курсор в верхнюю часть экрана и вместо этого перезаписать части старого вывода.
Этот скрипт оставит артефакты, если ваш вывод уменьшается. Это также не очень вероятно, будет портативным. Я проверял это только с помощью urxvt, xterm и st.
источник
tput clear
с теми же результатами (мигает)tput ed
. Но это вызывает миганиеtput ed
правой доdo_a_lot...
линии, я вижу мигающий в urxvt , но не XTerm или ст.В качестве продолжения ответа Кристиана я сделал следующую функцию bash, которая работает, если окно консоли меньше выходных данных команды:
Это позволяет передавать любую команду наблюдателю. Если вы используете git, используйте
git config --global color.status always
и затем:Будет отображать постоянно обновляемый вывод состояния git.
источник