LINUX.ORG.RU

Перерисовывать несколько строк в терминале

 ,


0

2

Есть скрипт, который каждые несколько секунд выводит на экран несколько строк. Сейчас он засоряет буфер прокрутки экрана вверх, тоесть при прокрутке экрана вверх много выводов строк.
Можно ли как-то сделать, чтобы стиралось несколько предыдущих строк для вывода новых экземпляров строк?

★★★★★

Ответ на: комментарий от Goury

watch нельзя закрывать клавишей Q , а мой скрипт это понимает

тоесть получается только CTRL+C

teod0r ★★★★★
() автор топика
Последнее исправление: teod0r (всего исправлений: 2)
Ответ на: комментарий от surefire

пробую в цикле запускать

clear
tput cup 4 0
echo -e "VAR1\n\n\n$VAR2\n\n$VAR3"


при прокрутке оно тоже остаётся в истории прокрутки
teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

Это не глюки, это просто курсор становиться и печатает поверх старого текста. Тебе желательно печатать строку целиком от начала до конца, что бы затирать старый вывод.

surefire ★★★
()
Ответ на: комментарий от teod0r

вместо echo -e "VAR1\n\n\n$VAR2\n\n$VAR3"

сделай, что-то типа этого

printf '%-40s\n%40s\n%-40s' "$VAR1" "$VAR2" "$VAR3"

Если ты просто сделаешь \n курсор перескочит и строку не затрет, нужно печатать пробелы.

surefire ★★★
()
Ответ на: комментарий от surefire

какой-то нерабочий printf. у меня что-то не так выводит

teod0r ★★★★★
() автор топика
Последнее исправление: teod0r (всего исправлений: 1)
Ответ на: комментарий от teod0r

Это ни на что не влияет, переменная в 23 символа, добивается 17 пробелами, слева или справа и без разницы, что за 23 символа.

surefire ★★★
()

А так?

#!/bin/bash

echo "\n\n\n\n"
for i in 1 2 3 4 5
do
    echo "\033[5A"
    echo "1 number $i"
    echo "2 number $i"
    echo "3 number $i"
    echo "4 number $i"
    sleep 1
done
Не знаю насколько оно будет компатибля со всякими zsh и прочими.

deep-purple ★★★★★
()

Я сегодня очки забыл, не вижу. Сколько там у тебя звёздочек?

Почитай про анси-последовательности. Там есть комбинация для сохранения для восстановление позиции. Перед тем, как что-то писать в консоль, сохрани позицию и потом каждый раз восстанавливай когда понадобится переписать вывод.

anonymous
()
Ответ на: комментарий от deep-purple

только в 3 и 6 строках ключ -e нужен, а так работает.
НО там где есть строки, которые есть не в каждом экземпляре вывода — они остаются, не затираются!

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

так я пробовал, но видимо неправильно что-то делал. вобщем, не получалось

Ой, ладно, черт с вами! Держите:

#!/bin/bash

iscmd ()
{
    command -v "$@" 1>&-
}

if iscmd tput; then
    TERM_SC=$(tput sc)
    TERM_RC=$(tput rc)
    TERM_ED=$(tput ed)
fi

msg-progress-initialize ()
{
    if [[ -t 2 && $TERM_SC && $TERM_RC && $TERM_ED ]]; then
        printf >&2 '%s' "$TERM_SC"
        _msg_progress_state=1
    fi
}

msg-progress ()
{
    if [[ $_msg_progress_state ]]; then
        printf >&2 '%s' "$TERM_RC" "$TERM_ED"
    fi

    if (( $# > 0 )); then
        printf >&2 '%s\n' "$@"
    else
        while read -r; do
            printf >&2 '%s\n' "$REPLY"
        done
    fi
}

msg-progress-terminate ()
{
    if [[ $_msg_progress_state ]]; then
        printf >&2 '%s' "$TERM_RC" "$TERM_ED"
        unset _msg_progress_state
    fi
}

msg-progress-initialize
msg-progress $"Let’s begin!"
sleep 1
for i in {1..5}; do
    fortune | msg-progress
    sleep 3
done
msg-progress-terminate
Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

я пока не проверял, не до этого
сходу возник вопрос: что такое "fortune"? если это какая-то прога, то в генте её не нашёл

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

Простите, а что вы собирались проверять?

fortune(1) — да, программка такая. И я думаю, что она еще Брежнева застала. Так или иначе, по сей день остается частью постюниксовой культуры. Но допускаю, что в вашей Генте всякое может быть.

Zmicier ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.