Bash script, стереть предыдущую строку?

Во многих программах Linux, таких как curl, wget и что-либо с индикатором прогресса, они постоянно обновляют нижнюю строку, каждый определенный промежуток времени. Как это сделать в bash script? Все, что я могу сделать сейчас, это просто эхо-новая линия, и это не то, что я хочу, потому что она накапливается. Я натолкнулся на что-то, что упоминало "tput cup 0 0", но я попробовал, и это было изворотливым. Какой лучший способ?

Ответы

Ответ 1

{
  for pc in $(seq 1 100); do
    echo -ne "$pc%\033[0K\r"
    usleep 100000
  done
  echo
}

"\ 033 [0K" будет удаляться до конца строки - в случае, если ваша контрольная строка в какой-то момент становится короче, хотя это может быть и не для ваших целей.

"\ r" переместит курсор в начало текущей строки

-n on echo предотвратит переход курсора к следующей строке

Ответ 2

Небольшая вариация на примере кода linuts для перемещения курсора не к началу, а к концу текущей строки.

{
  for pc in {1..100}; do
    #echo -ne "$pc%\033[0K\r"
    echo -ne "\r\033[0K${pc}%"
    sleep 1
  done
  echo
}

Ответ 3

printf '\r', как правило. В этом случае нет причин для адресации курсора.

Ответ 4

Вы также можете использовать tput cuu1;tput el (или printf '\e[A\e[K'), чтобы переместить курсор на одну строку и стереть строку:

for i in {1..100};do echo $i;sleep 1;tput cuu1;tput el;done

Ответ 5

echo -n "foo" также печатает его без новой строки в конце.