Перезаписать предыдущий вывод в 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 ответов

[F1]
14
ответ дан 26 May 2018 в 00:07
  • 1
    Удивительно, большое спасибо. Только одно уведомление для других читателей. Чтобы соответствовать приведенному выше коду, вы должны использовать echo -en " \ b \ b \ b " из-за пространства. – NES 4 December 2010 в 16:10
  • 2
    +1 Хороший, но ... ниже 10 он начинает есть сообщение ... – lepe 28 January 2011 в 07:51
  • 3
    Да, лучше использовать \r. См. Мой ответ. – Mikel 4 February 2011 в 03:44
  • 4
    Из руководства bash: The old format $[expression] is deprecated and will be removed in upcoming versions of bash.. Вместо этого используйте команду POSIX $((expression)) или ((. Например. sek=$(( sek - 1 )) или (( sek = sek - 1 )) или (( sek-- )). – geirha 4 February 2011 в 03:49
[F1]
14
ответ дан 25 July 2018 в 22:48
[F1]
14
ответ дан 27 July 2018 в 00:28
[F1]
14
ответ дан 31 July 2018 в 11:42
[F1]
14
ответ дан 2 August 2018 в 04:12
  #! / bin / bash sek = 60 эхо "60 секунд ожидания!"  echo -n «One Moment please», в то время как [$ sek -ge 1] do echo -n «$ sek» sleep 1 sek = $ [$ sek-1] echo -en "\ b \ b" done echo echo "готов!  "   
14
ответ дан 4 August 2018 в 20:16
  #! / bin / bash sek = 60 эхо "60 секунд ожидания!"  echo -n «One Moment please», в то время как [$ sek -ge 1] do echo -n «$ sek» sleep 1 sek = $ [$ sek-1] echo -en "\ b \ b" done echo echo "готов!  "   
14
ответ дан 6 August 2018 в 04:17
  #! / bin / bash sek = 60 эхо "60 секунд ожидания!"  echo -n «One Moment please», в то время как [$ sek -ge 1] do echo -n «$ sek» sleep 1 sek = $ [$ sek-1] echo -en "\ b \ b" done echo echo "готов!  "   
14
ответ дан 7 August 2018 в 22:21
  #! / bin / bash sek = 60 эхо "60 секунд ожидания!"  echo -n «One Moment please», в то время как [$ sek -ge 1] do echo -n «$ sek» sleep 1 sek = $ [$ sek-1] echo -en "\ b \ b" done echo echo "готов!  "   
14
ответ дан 10 August 2018 в 10:31
  #! / bin / bash sek = 60 эхо "60 секунд ожидания!"  echo -n «One Moment please», в то время как [$ sek -ge 1] do echo -n «$ sek» sleep 1 sek = $ [$ sek-1] echo -en "\ b \ b" done echo echo "готов!  "   
14
ответ дан 13 August 2018 в 16:58
  • 1
    Удивительно, большое спасибо. Только одно уведомление для других читателей. Чтобы соответствовать приведенному выше коду, вы должны использовать echo -en & quot; \ b \ b \ b & quot; из-за пространства. – NES 4 December 2010 в 16:10
  • 2
    +1 Хороший, но ... ниже 10 он начинает есть сообщение ... – lepe 28 January 2011 в 07:51
  • 3
    Да, лучше использовать \r . См. Мой ответ. – Mikel 4 February 2011 в 03:44
  • 4
    Из руководства bash: Старый формат $ [выражение] устарел и будет удален в следующих версиях bash. . Вместо этого используйте POSIX $ ((выражение)) или команду ((. Например, sek = $ ((sek - 1)) или ((sek = sek - 1)) или ((sek--)) . – geirha 4 February 2011 в 03:49

В основном то же самое, что и ответ 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!"
14
ответ дан 26 May 2018 в 00:07

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

#BASH
SECONDS=0;
while sleep .5 && ((SECONDS <= 60)); do 
    printf '\r%s: %2d' "One moment please" "$((60-SECONDS))"
done
printf '\n'
6
ответ дан 26 May 2018 в 00:07
  • 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

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

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
ответ дан 26 May 2018 в 00:07

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

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
ответ дан 26 May 2018 в 00:07
  • 1
    Это не отвечает на вопрос о перезаписи текста – Jeremy Kerr 20 October 2011 в 14:14

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

#BASH SECONDS=0; while sleep .5 && ((SECONDS <= 60)); do printf '\r%s: %2d' "One moment please" "$((60-SECONDS))" done printf '\n'
6
ответ дан 25 July 2018 в 22:48
  • 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

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

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
ответ дан 25 July 2018 в 22:48
  • 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
ответ дан 25 July 2018 в 22:48

В дополнение к подходам \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
ответ дан 25 July 2018 в 22:48

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

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
ответ дан 25 July 2018 в 22:48

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

#BASH SECONDS=0; while sleep .5 && ((SECONDS <= 60)); do printf '\r%s: %2d' "One moment please" "$((60-SECONDS))" done printf '\n'
6
ответ дан 27 July 2018 в 00:28
  • 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

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

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
ответ дан 27 July 2018 в 00:28
  • 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
ответ дан 27 July 2018 в 00:28

В дополнение к подходам \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
ответ дан 27 July 2018 в 00:28

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

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
ответ дан 27 July 2018 в 00:28

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

#BASH SECONDS=0; while sleep .5 && ((SECONDS <= 60)); do printf '\r%s: %2d' "One moment please" "$((60-SECONDS))" done printf '\n'
6
ответ дан 31 July 2018 в 11:42
  • 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

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

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
ответ дан 31 July 2018 в 11:42
  • 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
ответ дан 31 July 2018 в 11:42

В дополнение к подходам \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
ответ дан 31 July 2018 в 11:42

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

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
ответ дан 31 July 2018 в 11:42

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

#BASH SECONDS=0; while sleep .5 && ((SECONDS <= 60)); do printf '\r%s: %2d' "One moment please" "$((60-SECONDS))" done printf '\n'
6
ответ дан 2 August 2018 в 04:12
  • 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

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

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