Перезаписать предыдущий вывод в Bash вместо добавления его

Если вы хотите использовать средство просмотра KDE в Firefox, вы можете использовать плагин KParts. Для этого установите пакет kpartsplugin. Из описания пакета:

Это программное обеспечение реализует плагин для Netscape-совместимых браузеров в средах Unix. Этот плагин использует технологию KParts KDE для встраивания файловых зрителей (например, для файлов PDF) в не-KDE-браузеры. Тестируемые браузеры включают в себя как Mozilla Firefox, так и Opera, а также знают, как работать с Chrome и Arora. С помощью этого плагина вы можете просматривать файлы PDF в Firefox, используя Okular как встроенный плагин.

Здесь я открыл PDF-документ в Firefox с помощью встроенного Okular KPart:

18
задан 5 December 2010 в 00:34

60 ответов

Таймер обратного отсчета:

MIN=1 && for i in $(seq $(($MIN*60)) -1 1); do echo -n "$i, "; sleep 1; done; echo -e "nnMessage"

и «нормальный» секундомер:

START=$( date +%s ); while true; do CURRENT=$( date +%s ) ; echo $(( CURRENT-START )) ; sleep 1 ; echo -n ; done

control + c, чтобы остановить

-2
ответ дан 2 August 2018 в 04:12
  • 1
    Это не отвечает на вопрос о перезаписи текста – Jeremy Kerr 20 October 2011 в 14:14

В основном то же самое, что и ответ aneeshep, но использует Return (\r), а не Backspace (\b), потому что мы не знаем, будет ли длина всегда одинаковой, например. если $sek < 10.

Кроме того, ваш первый echo должен использовать $sek, а не жесткий код 60.

Наконец, обратите внимание на пробел после ... .

#!/bin/bash sek=60 echo "$sek Seconds Wait!" while [ $sek -ge 1 ] do echo -ne "One Moment please $sek ... \r" sleep 1 sek=$[$sek-1] done echo echo "ready!"
15
ответ дан 2 August 2018 в 04:12

В дополнение к подходам \r или \b можно использовать управляющий символ \033[2K, который сообщает терминалу очистить всю строку. Преимущество этого по сравнению с \b заключается в том, что вам не нужно сопоставлять число \b с количеством символов, которое вы хотите удалить, и по сравнению с \r на экране не будут присутствовать символы, торчащие на экране если новая строка короче старой.

Ниже приведен пример того, как он может быть применен к этому вопросу, а управляющий символ является примером связанного приложения для создания вывода, аналогичного загрузочным сообщениям. В этом конкретном примере таймер исчезнет после достижения 0-й секунды, а линия таймера будет заменена на «Готов!». фраза

#!/bin/bash sek=60 echo "60 Seconds" while ((sek--)); do printf "One moment please: %d" "$sek" sleep 1 printf "\r%b" "\033[2K" done echo "Ready!"

Другой альтернативой было бы использование команды dialog для создания простых диалогов в командной строке. Диалог останется на экране в течение всего таймера и обновится с помощью цикла, и к моменту его завершения таймер будет заменен на сообщение «Готово! Нажмите, чтобы выйти»:

#!/bin/bash sek=60 echo "60 Seconds" while ((sek--)); do echo "$sek" | dialog --progressbox "Please wait" 10 25 sleep 1 done dialog --msgbox "Ready! Press <OK> to finish" 10 25
1
ответ дан 2 August 2018 в 04:12

Это то, что я придумал после прочтения здесь и немного больше, один лайнер:

SEC=101;for i in `seq $SEC -1 1`;do printf "\rNext in: %`expr length $SEC`ds" "$i";sleep 1;done;echo

Более читаемый:

#!/bin/bash SEC=101 for i in `seq $SEC -1 1`;do printf "\rNext in: %`expr length $SEC`ds" "$i"; sleep 1; done echo

Где можно установить SEC к любому положительному целому числу, и printf позаботится о соответствующем заполнении. Протестировано под Ubuntu и cygwin.

1
ответ дан 2 August 2018 в 04:12

Это то, что я придумал после прочтения здесь и немного больше, один лайнер:

  SEC = 101; для i в `seq $ SEC -1 1`; do printf  "\rNext in:%` expr length $ SEC`ds "" $ i "; sleep 1; done; echo  

Более читаемый:

  #  ! / bin / bash SEC = 101 для i в `seq $ SEC -1 1`; do printf" \rNext in:% `expr length $ SEC`ds" "$ i";  сон 1;  done echo  

Если SEC может быть настроен на любое положительное целое число, и printf позаботится о соответствующем заполнении. Протестировано под Ubuntu и cygwin.

1
ответ дан 4 August 2018 в 20:16

В дополнение к \r или \ b подходам можно использовать управляющий символ \ 033 [2K , который сообщает терминалу очистить всю строку. Преимущество этого по сравнению с \ b заключается в том, что вам не нужно сопоставлять число \ b с количеством символов, которое вы хотите удалить, и по сравнению с \r не будет символов, торчащих на экране, если новая строка короче старой.

Ниже приведен пример того, как он может быть применен к этому вопросу, а здесь является примером связанного приложения для создания вывода, аналогичного загрузочным сообщениям. В этом конкретном примере таймер исчезнет после достижения 0-й секунды, а линия таймера будет заменена на «Готов!». фраза.

  #! / bin / bash sek = 60 эхо "60 секунд" while ((sek--));  do printf "Один момент, пожалуйста:% d" "$ sek" sleep 1 printf "\r% b" "\ 033 [2K" done echo "Ready!"   

Другой альтернативой может быть использование команды dialog для создания простых диалогов в командной строке. Диалог останется на экране в течение всего таймера и обновится с циклом, и к моменту его завершения таймер будет заменен на сообщение «Готово! Нажмите, чтобы выйти»:

  #! / bin / bash sek = 60 эхо "60 секунд" while ((sek--));  do echo "$ sek" |  dialog --progressbox «Please wait» 10 25 sleep 1 done dialog --msgbox «Готово! Нажмите & lt; OK & gt; для завершения» 10 25  
1
ответ дан 4 August 2018 в 20:16

С помощью bash вы можете использовать специальную переменную SECONDS .

  #BASH SECONDS = 0;  в то время как сон .5 & amp; & amp;  ((SECONDS & lt; = 60));  do printf '\r% s:% 2d' "Один момент, пожалуйста," "$ ((60-SECONDS))" done printf '\n'  
6
ответ дан 4 August 2018 в 20:16

Таймер обратного отсчета:

  MIN = 1 & amp; & amp;  для i в $ (seq $ (($ MIN * 60)) -1 1);  do echo -n "$ i,";  сон 1;  сделанный;  echo -e "nnMessage"  

и «нормальный» секундомер:

  START = $ (дата +% s);  хотя это правда;  do CURRENT = $ (дата +% s);  echo $ ((ТЕКУЩИЙ СТАРТ));  сон 1;  echo -n;  done  

управление + c остановка

-2
ответ дан 4 August 2018 в 20:16

В основном то же, что и ответ aneeshep, но использует Return ( \r ), а не Backspace ( \ b ), потому что мы не знаем, будет ли длина всегда то же самое, например когда $ sek & lt; 10 .

Кроме того, ваш первый echo должен использовать $ sek , а не hard-code 60 .

Наконец, обратите внимание на пробел после ... .

  #! / bin / bash sek = 60 echo "$ sek Секунды ожидания  !»  в то время как [$ sek -ge 1] do echo -ne "One Moment please $ sek ... \r" sleep 1 sek = $ [$ sek-1] done echo echo "ready!"   
15
ответ дан 4 August 2018 в 20:16

Это то, что я придумал после прочтения здесь и немного больше, один лайнер:

  SEC = 101; для i в `seq $ SEC -1 1`; do printf  "\rNext in:%` expr length $ SEC`ds "" $ i "; sleep 1; done; echo  

Более читаемый:

  #  ! / bin / bash SEC = 101 для i в `seq $ SEC -1 1`; do printf" \rNext in:% `expr length $ SEC`ds" "$ i";  сон 1;  done echo  

Если SEC может быть настроен на любое положительное целое число, и printf позаботится о соответствующем заполнении. Протестировано под Ubuntu и cygwin.

1
ответ дан 6 August 2018 в 04:17

В дополнение к \r или \ b подходам можно использовать управляющий символ \ 033 [2K , который сообщает терминалу очистить всю строку. Преимущество этого по сравнению с \ b заключается в том, что вам не нужно сопоставлять число \ b с количеством символов, которое вы хотите удалить, и по сравнению с \r не будет символов, торчащих на экране, если новая строка короче старой.

Ниже приведен пример того, как он может быть применен к этому вопросу, а здесь является примером связанного приложения для создания вывода, аналогичного загрузочным сообщениям. В этом конкретном примере таймер исчезнет после достижения 0-й секунды, а линия таймера будет заменена на «Готов!». фраза.

  #! / bin / bash sek = 60 эхо "60 секунд" while ((sek--));  do printf "Один момент, пожалуйста:% d" "$ sek" sleep 1 printf "\r% b" "\ 033 [2K" done echo "Ready!"   

Другой альтернативой может быть использование команды dialog для создания простых диалогов в командной строке. Диалог останется на экране в течение всего таймера и обновится с циклом, и к моменту его завершения таймер будет заменен на сообщение «Готово! Нажмите, чтобы выйти»:

  #! / bin / bash sek = 60 эхо "60 секунд" while ((sek--));  do echo "$ sek" |  dialog --progressbox «Please wait» 10 25 sleep 1 done dialog --msgbox «Готово! Нажмите & lt; OK & gt; для завершения» 10 25  
1
ответ дан 6 August 2018 в 04:17

С помощью bash вы можете использовать специальную переменную SECONDS .

  #BASH SECONDS = 0;  в то время как сон .5 & amp; & amp;  ((SECONDS & lt; = 60));  do printf '\r% s:% 2d' "Один момент, пожалуйста," "$ ((60-SECONDS))" done printf '\n'  
6
ответ дан 6 August 2018 в 04:17

Таймер обратного отсчета:

  MIN = 1 & amp; & amp;  для i в $ (seq $ (($ MIN * 60)) -1 1);  do echo -n "$ i,";  сон 1;  сделанный;  echo -e "nnMessage"  

и «нормальный» секундомер:

  START = $ (дата +% s);  хотя это правда;  do CURRENT = $ (дата +% s);  echo $ ((ТЕКУЩИЙ СТАРТ));  сон 1;  echo -n;  done  

управление + c остановка

-2
ответ дан 6 August 2018 в 04:17

В основном то же, что и ответ aneeshep, но использует Return ( \r ), а не Backspace ( \ b ), потому что мы не знаем, будет ли длина всегда то же самое, например когда $ sek & lt; 10 .

Кроме того, ваш первый echo должен использовать $ sek , а не hard-code 60 .

Наконец, обратите внимание на пробел после ... .

  #! / bin / bash sek = 60 echo "$ sek Секунды ожидания  !»  в то время как [$ sek -ge 1] do echo -ne "One Moment please $ sek ... \r" sleep 1 sek = $ [$ sek-1] done echo echo "ready!"   
15
ответ дан 6 August 2018 в 04:17

Это то, что я придумал после прочтения здесь и немного больше, один лайнер:

  SEC = 101; для i в `seq $ SEC -1 1`; do printf  "\rNext in:%` expr length $ SEC`ds "" $ i "; sleep 1; done; echo  

Более читаемый:

  #  ! / bin / bash SEC = 101 для i в `seq $ SEC -1 1`; do printf" \rNext in:% `expr length $ SEC`ds" "$ i";  сон 1;  done echo  

Если SEC может быть настроен на любое положительное целое число, и printf позаботится о соответствующем заполнении. Протестировано под Ubuntu и cygwin.

1
ответ дан 7 August 2018 в 22:21

В дополнение к \r или \ b подходам можно использовать управляющий символ \ 033 [2K , который сообщает терминалу очистить всю строку. Преимущество этого по сравнению с \ b заключается в том, что вам не нужно сопоставлять число \ b с количеством символов, которое вы хотите удалить, и по сравнению с \r не будет символов, торчащих на экране, если новая строка короче старой.

Ниже приведен пример того, как он может быть применен к этому вопросу, а здесь является примером связанного приложения для создания вывода, аналогичного загрузочным сообщениям. В этом конкретном примере таймер исчезнет после достижения 0-й секунды, а линия таймера будет заменена на «Готов!». фраза.

  #! / bin / bash sek = 60 эхо "60 секунд" while ((sek--));  do printf "Один момент, пожалуйста:% d" "$ sek" sleep 1 printf "\r% b" "\ 033 [2K" done echo "Ready!"   

Другой альтернативой может быть использование команды dialog для создания простых диалогов в командной строке. Диалог останется на экране в течение всего таймера и обновится с циклом, и к моменту его завершения таймер будет заменен на сообщение «Готово! Нажмите, чтобы выйти»:

  #! / bin / bash sek = 60 эхо "60 секунд" while ((sek--));  do echo "$ sek" |  dialog --progressbox «Please wait» 10 25 sleep 1 done dialog --msgbox «Готово! Нажмите & lt; OK & gt; для завершения» 10 25  
1
ответ дан 7 August 2018 в 22:21

С помощью bash вы можете использовать специальную переменную SECONDS .

  #BASH SECONDS = 0;  в то время как сон .5 & amp; & amp;  ((SECONDS & lt; = 60));  do printf '\r% s:% 2d' "Один момент, пожалуйста," "$ ((60-SECONDS))" done printf '\n'  
6
ответ дан 7 August 2018 в 22:21

Таймер обратного отсчета:

  MIN = 1 & amp; & amp;  для i в $ (seq $ (($ MIN * 60)) -1 1);  do echo -n "$ i,";  сон 1;  сделанный;  echo -e "nnMessage"  

и «нормальный» секундомер:

  START = $ (дата +% s);  хотя это правда;  do CURRENT = $ (дата +% s);  echo $ ((ТЕКУЩИЙ СТАРТ));  сон 1;  echo -n;  done  

управление + c остановка

-2
ответ дан 7 August 2018 в 22:21

В основном то же, что и ответ aneeshep, но использует Return ( \r ), а не Backspace ( \ b ), потому что мы не знаем, будет ли длина всегда то же самое, например когда $ sek & lt; 10 .

Кроме того, ваш первый echo должен использовать $ sek , а не hard-code 60 .

Наконец, обратите внимание на пробел после ... .

  #! / bin / bash sek = 60 echo "$ sek Секунды ожидания  !»  в то время как [$ sek -ge 1] do echo -ne "One Moment please $ sek ... \r" sleep 1 sek = $ [$ sek-1] done echo echo "ready!"   
15
ответ дан 7 August 2018 в 22:21

С помощью bash вы можете использовать специальную переменную SECONDS .

  #BASH SECONDS = 0;  в то время как сон .5 & amp; & amp;  ((SECONDS & lt; = 60));  do printf '\r% s:% 2d' "Один момент, пожалуйста," "$ ((60-SECONDS))" done printf '\n'  
6
ответ дан 10 August 2018 в 10:31

Таймер обратного отсчета:

  MIN = 1 & amp; & amp;  для i в $ (seq $ (($ MIN * 60)) -1 1);  do echo -n "$ i,";  сон 1;  сделанный;  echo -e "nnMessage"  

и «нормальный» секундомер:

  START = $ (дата +% s);  хотя это правда;  do CURRENT = $ (дата +% s);  echo $ ((ТЕКУЩИЙ СТАРТ));  сон 1;  echo -n;  done  

управление + c остановка

-2
ответ дан 10 August 2018 в 10:31

В основном то же, что и ответ aneeshep, но использует Return ( \r ), а не Backspace ( \ b ), потому что мы не знаем, будет ли длина всегда то же самое, например когда $ sek & lt; 10 .

Кроме того, ваш первый echo должен использовать $ sek , а не hard-code 60 .

Наконец, обратите внимание на пробел после ... .

  #! / bin / bash sek = 60 echo "$ sek Секунды ожидания  !»  в то время как [$ sek -ge 1] do echo -ne "One Moment please $ sek ... \r" sleep 1 sek = $ [$ sek-1] done echo echo "ready!"   
15
ответ дан 10 August 2018 в 10:31

Это то, что я придумал после прочтения здесь и немного больше, один лайнер:

  SEC = 101; для i в `seq $ SEC -1 1`; do printf  "\rNext in:%` expr length $ SEC`ds "" $ i "; sleep 1; done; echo  

Более читаемый:

  #  ! / bin / bash SEC = 101 для i в `seq $ SEC -1 1`; do printf" \rNext in:% `expr length $ SEC`ds" "$ i";  сон 1;  done echo  

Если SEC может быть настроен на любое положительное целое число, и printf позаботится о соответствующем заполнении. Протестировано под Ubuntu и cygwin.

1
ответ дан 10 August 2018 в 10:31

В дополнение к \r или \ b подходам можно использовать управляющий символ \ 033 [2K , который сообщает терминалу очистить всю строку. Преимущество этого по сравнению с \ b заключается в том, что вам не нужно сопоставлять число \ b с количеством символов, которое вы хотите удалить, и по сравнению с \r не будет символов, торчащих на экране, если новая строка короче старой.

Ниже приведен пример того, как он может быть применен к этому вопросу, а здесь является примером связанного приложения для создания вывода, аналогичного загрузочным сообщениям. В этом конкретном примере таймер исчезнет после достижения 0-й секунды, а линия таймера будет заменена на «Готов!». фраза.

  #! / bin / bash sek = 60 эхо "60 секунд" while ((sek--));  do printf "Один момент, пожалуйста:% d" "$ sek" sleep 1 printf "\r% b" "\ 033 [2K" done echo "Ready!"   

Другой альтернативой может быть использование команды dialog для создания простых диалогов в командной строке. Диалог останется на экране в течение всего таймера и обновится с циклом, и к моменту его завершения таймер будет заменен на сообщение «Готово! Нажмите, чтобы выйти»:

  #! / bin / bash sek = 60 эхо "60 секунд" while ((sek--));  do echo "$ sek" |  dialog --progressbox «Please wait» 10 25 sleep 1 done dialog --msgbox «Готово! Нажмите & lt; OK & gt; для завершения» 10 25  
1
ответ дан 10 August 2018 в 10:31

Это то, что я придумал после прочтения здесь и немного больше, один лайнер:

  SEC = 101; для i в `seq $ SEC -1 1`; do printf  "\rNext in:%` expr length $ SEC`ds "" $ i "; sleep 1; done; echo  

Более читаемый:

  #  ! / bin / bash SEC = 101 для i в `seq $ SEC -1 1`; do printf" \rNext in:% `expr length $ SEC`ds" "$ i";  сон 1;  done echo  

Если SEC может быть настроен на любое положительное целое число, и printf позаботится о соответствующем заполнении. Протестировано под Ubuntu и cygwin.

1
ответ дан 13 August 2018 в 16:58

В дополнение к \r или \ b подходам можно использовать управляющий символ \ 033 [2K , который сообщает терминалу очистить всю строку. Преимущество этого по сравнению с \ b заключается в том, что вам не нужно сопоставлять число \ b с количеством символов, которое вы хотите удалить, и по сравнению с \r не будет символов, торчащих на экране, если новая строка короче старой.

Ниже приведен пример того, как он может быть применен к этому вопросу, а здесь является примером связанного приложения для создания вывода, аналогичного загрузочным сообщениям. В этом конкретном примере таймер исчезнет после достижения 0-й секунды, а линия таймера будет заменена на «Готов!». фраза.

  #! / bin / bash sek = 60 эхо "60 секунд" while ((sek--));  do printf "Один момент, пожалуйста:% d" "$ sek" sleep 1 printf "\r% b" "\ 033 [2K" done echo "Ready!"   

Другой альтернативой может быть использование команды dialog для создания простых диалогов в командной строке. Диалог останется на экране в течение всего таймера и обновится с циклом, и к моменту его завершения таймер будет заменен на сообщение «Готово! Нажмите, чтобы выйти»:

  #! / bin / bash sek = 60 эхо "60 секунд" while ((sek--));  do echo "$ sek" |  dialog --progressbox «Please wait» 10 25 sleep 1 done dialog --msgbox «Готово! Нажмите & lt; OK & gt; для завершения» 10 25  
1
ответ дан 13 August 2018 в 16:58

В основном то же, что и ответ aneeshep, но использует Return ( \r ), а не Backspace ( \ b ), потому что мы не знаем, будет ли длина всегда то же самое, например когда $ sek & lt; 10 .

Кроме того, ваш первый echo должен использовать $ sek , а не hard-code 60 .

Наконец, обратите внимание на пробел после ... .

  #! / bin / bash sek = 60 echo "$ sek Секунды ожидания  !»  в то время как [$ sek -ge 1] do echo -ne "One Moment please $ sek ... \r" sleep 1 sek = $ [$ sek-1] done echo echo "ready!"   
15
ответ дан 13 August 2018 в 16:58

Таймер обратного отсчета:

  MIN = 1 & amp; & amp;  для i в $ (seq $ (($ MIN * 60)) -1 1);  do echo -n "$ i,";  сон 1;  сделанный;  echo -e "nnMessage"  

и «нормальный» секундомер:

  START = $ (дата +% s);  хотя это правда;  do CURRENT = $ (дата +% s);  echo $ ((ТЕКУЩИЙ СТАРТ));  сон 1;  echo -n;  done  

управление + c остановка

-2
ответ дан 13 August 2018 в 16:58
  • 1
    Это не отвечает на вопрос о перезаписи текста – Jeremy Kerr 20 October 2011 в 14:14

С помощью bash вы можете использовать специальную переменную SECONDS .

  #BASH SECONDS = 0;  в то время как сон .5 & amp; & amp;  ((SECONDS & lt; = 60));  do printf '\r% s:% 2d' "Один момент, пожалуйста," "$ ((60-SECONDS))" done printf '\n'  
6
ответ дан 13 August 2018 в 16:58
  • 1
    +1 Хороший ответ, плюс я никогда не знал о SECONDS. – Mikel 4 February 2011 в 03:47
  • 2
    Он работает, но это немного странно, видя «sleep .5» как проверенное условие while-loop. Howerver мне особенно нравится использование $ SECONDS, потому что оно относится к реальному времени (т. Е. Не фиксированное истекшее время между как и со сном 1) ... SECONDS Эта переменная расширяется до количества секунд с момента запуска оболочки. (поэтому я, вероятно, не установил бы это до 0 .. просто проверьте его на 60 секунд больше с момента запуска скрипта) .. +1 – Peter.O 4 February 2011 в 04:17
  • 3
    Я комментирую дальше, только потому, что лично меня интересует способ получить точную версию coutntdown ... Я тестировал $ SECONDS, и кажется, что он установлен на «0» или нет, он все еще зависит от текущей дробной секунды системы. Установка его на «0» может привести к времени 0.99 ... (то же самое верно, если оно оставлено как есть) .... Таким образом, его лучший средний шанс должен быть в пределах только 0,5 секунды. Просто комментарий (вот для чего нужны комментарии :) – Peter.O 4 February 2011 в 06:54
  • 4
    @ fred.bear Ну, вы никогда не получите это точно; какой-то другой процесс может начать запугивать CPU и / или IO во время обратного отсчета и разрушить любую точность, которую вы имели раньше. То, что вы можете сделать, - это дождаться как минимум X времени и дать приблизительный обратный отсчет. Когда в программе говорится, что «потребуется минутка», вы ожидаете, что она займет ровно 1 минуту, до миллисекунды? или взять 1 минуту, дать или занять несколько секунд? – geirha 4 February 2011 в 07:06
  • 5
    @geirha ... Да, эта вариация не будет иметь значения в 99% случаев, и ее замечательный опыт заставил меня узнать о $ SECONDS ... Я просто нахожу свои пределы ... Я играл с вариации вашего скрипта, который сообщает о времени окончания в зависимости от сна .01 с. (плюс, как вы уже упоминали, любой внешний системный лаг), но только печать при повторном нажатии, но затем я обнаружил, что первая «вторая» печаталась слишком рано (в одном случае, сразу после первого 0,01 сек.). Это все часть моей кривой обучения bash ... Мне нравится ваш ответ, поэтому я более глубоко посмотрел на него. – Peter.O 4 February 2011 в 07:25

Может достичь этого, установив возврат каретки \r.

В одной строке кода это возможно с помощью echo -ne

for i in {60..1}; do echo -ne "One moment please: $i\r" && sleep 1; done

или с printf

for i in {60..1}; do printf "One moment please: $i\r" && sleep 1; done
0
ответ дан 9 October 2018 в 11:39

Другие вопросы по тегам:

Похожие вопросы: