Обновите несколько строк в терминале с помощью echo - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть задание для моего проекта, и я не совсем понимаю предмет.

* Объектив 1005 *

  • Печать нескольких строк на терминале.
  • Обновление в реальном времени значения.

В качестве теста я пробовал десять строк, эмулированных из команды ps, в течение 30 секунд. `

#!/bin/bash
test=$(ps -ao pid,pcpu,time,comm | head -n10)

for time in $(seq 1 30); do
    echo -ne "$test\r"
    sleep 1
    test=$(ps -ao pid,pcpu,time,comm | head -n10)
done
  • Я знаю, что мой код не чистый, я пытаюсь его изучить, поэтому я посетил страницу руководства для console_codes и понял, что вам нужно использовать что-то вроде echo -e " text area \033\r" или что-то подобное, чтобы получить правильный курсор положение, чтобы обновить строку, и я в порядке для одной строки, но для десяти строк я полностью потерян.
  • Я использовал переменную для обновления одного echo, но я понял, что ошибаюсь в проблеме.
  • Если возможно, мне нужно решение для моего примера и объяснение того, как я могу обрабатывать несколько строк, потому что мой пример печатает на новых строках и не обновляет / не стирает старые.

Примечание: этот пример не является моим заданием, но представляет собой проблему, с которой я сейчас сталкиваюсь

Спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

Самым простым, наиболее переносимым и стабильным решением будет очистка экрана при каждой итерации:

#!/bin/bash

for i in {1..30} ; do
    clear

    # Print several lines
    printf "foo %d\n" "${i}"
    printf "bar %d\n" "${i}"

    sleep 1
done

В качестве альтернативы вы можете использовать следующие последовательности:

# Save the cursor position
printf "\033[s"
# Print two empty dummy lines
printf "\n\n"

for i in {1..30} ; do
    # Delete the last two lines
    printf "\033[2K"
    # Restore the cursor position
    printf "\033[u"

    # Print two lines
    printf "foo ${i}\n"
    printf "bar ${i}\n"

    sleep 1
done

Обратите внимание, чтовыше ^^^ решение будет работать, только если вы заранее знаете количество строк для печати / очистки.

0 голосов
/ 20 апреля 2019

Вы можете использовать echo -e "\e[nA" для перехода на n строк вверх (n должно быть целым числом). Если все строки имеют одинаковую длину, будет сделано следующее.

lines=10
for i in {0..30}; do
    ps -ao pid,pcpu,time,comm | head -n${lines}  # print `$lines` lines
    sleep 1
    echo -e "\e[$((${lines}+1))A"                # go `$lines + 1` up
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...