Я пытаюсь создать статус прогресса с возможностью обновления. Для этого мне нужно полностью очистить последний вывод, чтобы я мог его обновить. Возврат каретки может работать, но когда вывод длиннее ширины терминала и оборачивается, он не сможет очистить последний вывод. Итак, я использую tput:
n=0
while [[ $n -ne 100 ]]; do
n=$((n+1))
tput ed #clear
tput sc #save cursor
echo -n "Progress: ${n}%"
tput rc #restore cursor
sleep 1s
done
echo
Но это не сработает, если вывод будет достаточно длинным, чтобы терминал начал прокручиваться вверх. Когда это произойдет, сохраненная позиция курсора больше не будет правильной, и он не сможет правильно очистить последний вывод.
Например, если курсор в настоящее время находится внизу терминала, а вывод длиннее, чем ширина терминала, это заставит терминал прокручиваться вверх, аннулируя ранее сохраненную позицию курсора.
Итак, есть ли какие-либо способы гарантировать, что курсор никогда не окажется в конце терминала в Bash? Или, может быть, какие-то другие альтернативные методы предотвращения этой проблемы?
РЕДАКТИРОВАТЬ: Я создал свою собственную версию на основе ответа Ф. Хаури, упрощенного для моего варианта использования
#!/bin/bash
str=$(head -c 338 < /dev/zero | tr '\0' '\141')
len="${#str}"
col=$(tput cols)
lines=$(( ((len + col - 1) / col) - 1 ))
echo -ne "${str}\r"
(( len > col )) && tput cuu "$lines"
sleep 3s
tput ed