Напечатайте что-нибудь в консоли в том же месте, что и предыдущий эхо, с неким отрицательным эхом

9

В bash вы можете использовать команду с именем, clearчтобы очистить все экранные команды.

И echoвы можете распечатать все, что вы хотите на экране ..

В моих простых сценариях мне часто нужно печатать процент от того, что делается с моими командами ..

Так что я мог бы сделать что-то вроде ..

echo "89%"
echo "90%"
echo "91%"

и так далее..

то, что я ненавижу получать экран, полный процентных обновлений ...

89%
90%
91%
...

я хотел бы узнать, есть ли специальная комбинация символов (например, "\ 033 [01; 31m"), которая может быть отражена с помощью bash или php echo и говорит консоли "удалить последний предыдущий напечатанный символ .."

сделать это, используя что-то вроде: (пример PHP)

echo str_repeat($neg_character, strlen($last_percentage_update_string));
echo $new_percentage_update_string;

Я получил бы новую строку, напечатанную в точной позиции предыдущей без экрана, заполненного линиями

В противном случае я ищу подход, позволяющий сделать то же самое другими способами, всегда используя скрипты bash и php (пожалуйста, включите реальные рабочие примеры хотя бы с консолью debian9 и php7)

user3450548
источник

Ответы:

24

Типичный способ сделать это - не удалить один символ, а вернуться к началу строки с помощью возврата каретки ( \r):

printf "89%%"; sleep 1; printf "\r90%%\n"

Обратите внимание, что это не очищает линию, поэтому вам необходимо позаботиться об этом при необходимости. Простыми вариантами являются добавление пробелов в конец или вывод фиксированной ширины (например, printf "%2d%%\n" 1дает начальный пробел).

Существуют выходы терминала, которые позволят вам перемещаться и очищать части экрана, последовательности CSI , но они зависят от терминала (хотя на практике теперь выходы VT100 поддерживаются везде). Например

printf "89%%"; sleep 1; printf "\e[3D90%%\n"

используется ␛[3Dдля перемещения трех символов влево и записи над ними (при условии, что вы printfподдерживаете \e);

printf "89%% hello"; sleep 1; printf "\e[0E\e[K90%%\n"

используется ␛[0Eдля перемещения в начало текущей строки и ␛[Kочистки до конца строки (при условии, что ваш терминал поддерживает эти последовательности).

tputобеспечивает терминально- printfнезависимый способ доступа к этим последовательностям:

printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%\n"

переместите курсор влево три раза ( cub 3) и очистите до конца строки ( el), используя любую последовательность символов, подходящую для текущего терминала;

printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%\n"

переместит курсор в крайний левый столбец ( hpa 0) и очистит до конца строки.

man terminfoскажет вам, какое «имя возможности» использовать tput.

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

Для аналогичного управления экраном в сценариях PHP, вы можете посмотреть на ncursesрасширение PECL .

Стивен Китт
источник
5
Можно использовать , как правило , tput cub 3чтобы переместить куб rsor б ACK на 3 столбцов без необходимости прописывать последовательность (и tput elк й разрушайте в л INE).
Стефан Шазелас
1. \eне портативен 2. ни есть\e[0E
Стивен Пенни
Спасибо @Steven, я упомянул, что последовательности зависят от терминала, но я добавил еще несколько классификаторов.
Стивен Китт
Можно использовать echдля стирания. И движение назад на 3 позиции имеет сложность и две возможные оптимизации, которые, как правило, используют полноэкранные программы. Но и оптимизация, и стирание излишни для простых терминалов, работающих только с текущей строкой, если следовать этому совету использовать спецификатор формата с фиксированной шириной. Не забывайте, что 100это 3 цифры, кстати. (-:
JdeBP
Хорошие очки @JdeBP, спасибо. Как только вы достигнете 100%, я надеюсь, что вам больше не нужны обновления прогресса ;-).
Стивен Китт