Como posso exibir um temporizador de contagem regressiva em tempo real no terminal Linux? Existe um aplicativo existente ou, melhor ainda, um liner para fazer isso?
fonte
Como posso exibir um temporizador de contagem regressiva em tempo real no terminal Linux? Existe um aplicativo existente ou, melhor ainda, um liner para fazer isso?
Não sei por que você precisa beep
, se tudo o que você quer é um cronômetro, você pode fazer isso:
while true; do echo -ne "`date`\r"; done
Isso mostrará os segundos que passam em tempo real e você poderá interrompê-lo com Ctrl+ C. Se você precisar de maior precisão, poderá usar isso para fornecer nanossegundos:
while true; do echo -ne "`date +%H:%M:%S:%N`\r"; done
Por fim, se você realmente deseja "formato de cronômetro", onde tudo começa em 0 e começa a crescer, você pode fazer algo assim:
date1=`date +%s`; while true; do
echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
done
Para um contador regressivo (que não é o que sua pergunta original pediu), você pode fazer isso (alterar os segundos de acordo):
seconds=20; date1=$((`date +%s` + $seconds));
while [ "$date1" -ge `date +%s` ]; do
echo -ne "$(date -u --date @$(($date1 - `date +%s` )) +%H:%M:%S)\r";
done
Você pode combiná-los em comandos simples usando as funções bash (ou qualquer shell que você preferir). No bash, adicione essas linhas ao seu ~/.bashrc
( sleep 0.1
isso fará com que o sistema aguarde 1/10 de segundo entre cada execução para que você não faça spam na sua CPU):
function countdown(){
date1=$((`date +%s` + $1));
while [ "$date1" -ge `date +%s` ]; do
echo -ne "$(date -u --date @$(($date1 - `date +%s`)) +%H:%M:%S)\r";
sleep 0.1
done
}
function stopwatch(){
date1=`date +%s`;
while true; do
echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
sleep 0.1
done
}
Você pode iniciar um contador regressivo de um minuto executando:
countdown 60
Você pode contar duas horas com:
countdown $((2*60*60))
ou um dia inteiro usando:
countdown $((24*60*60))
E inicie o cronômetro executando:
stopwatch
Se você precisar lidar com dias, além de horas, minutos e segundos, poderá fazer algo assim:
countdown(){
date1=$((`date +%s` + $1));
while [ "$date1" -ge `date +%s` ]; do
## Is this more than 24h away?
days=$(($(($(( $date1 - $(date +%s))) * 1 ))/86400))
echo -ne "$days day(s) and $(date -u --date @$(($date1 - `date +%s`)) +%H:%M:%S)\r";
sleep 0.1
done
}
stopwatch(){
date1=`date +%s`;
while true; do
days=$(( $(($(date +%s) - date1)) / 86400 ))
echo -ne "$days day(s) and $(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
sleep 0.1
done
}
Observe que a stopwatch
função não foi testada há dias, pois eu realmente não queria esperar 24 horas por ela. Deve funcionar, mas por favor me avise se não funcionar.
.zshrc
direita depois de ler sua resposta. Hoje eu useicountdown
a primeira vez e notei um uso bastante alto da CPU. Eu adicionei umsleep 0.1
(não sei se um tempo de sono de um segundo fracionário é suportado em todos os sistemas), o que melhorou bastante. A desvantagem é, obviamente, uma precisão de exibição menos precisa, mas posso viver com um desvio de no máximo. 100ms.bash
, posso conviver com isso (embora seja maior do que eu esperava e também adicionei o sono ao meu .bashrc).date +%s
- $ date1)) +% H:% M:% S) ";echo -ne "$(date -ju -f %s $(($date1 -
data +% s)) +%H:%M:%S)\r"
;play -q -n synth 2 pluck C5
.Minha maneira favorita é:
Começar:
Pare:
Como o @wjandrea comentou abaixo, outra versão deve ser executada:
e pressione
Enter
para pararfonte
time read
time read
falha no zsh, mastime (read)
funciona.Eu estava procurando a mesma coisa e acabei escrevendo algo mais elaborado em Python:
Isso fornecerá uma contagem regressiva simples de 10 segundos:
Fonte: https://github.com/trehn/termdown
fonte
Eu usei este:
Exemplo:
Aqui está uma fonte .
fonte
definir um temporizador por 15 minutos
edit: Eu tinha um monte de links abertos, e eu pensei que isso era específico para osx, desculpe por isso. Deixando minha resposta para que outros estejam cientes da licença nos BSDs.
fonte
Isto é para um cronômetro com centésimos de segundo:
Exemplo
fonte
return $1
Combinei a muito boa resposta do terdon, em uma função que ao mesmo tempo mostra o tempo desde o início e o tempo até o fim. Também existem três variantes, portanto é mais fácil chamar (você não precisa fazer bash math) e também é abstraído. Exemplo de uso :
E algo como temporizador de trabalho:
E se você precisar de um tempo muito específico:
Aqui está o código para colocar no seu .bashrc
Combine isso com alguma maneira de reproduzir som no terminal linux ( reproduza arquivos mp3 ou wav via linha de comando do Linux ) ou cygwin (
cat /path/foo.wav > /dev/dsp
funciona para mim no babun / win7) e você terá um timer flexível e simples com alarme !fonte
Outra abordagem
Para Mac:
Se alguém quer um sinal quando atinge zero, pode-se, por exemplo, construí-lo com um comando que retorne um status de saída diferente de zero em zero e combiná-lo com
watch -b
, ou algo assim, mas se você quiser criar um script mais elaborado, provavelmente isso não é o caminho a percorrer; é mais uma solução do tipo "rápido e sujo de uma linha".Eu gosto do
watch
programa em geral. Vi pela primeira vez depois de já ter escrito inúmeraswhile sleep 5; do
voltas com efeitos diferentes.watch
foi comprovadamente melhor.fonte
Acabei escrevendo meu próprio script shell: github gist
fonte
Estou surpreso que ninguém tenha usado a
sleepenh
ferramenta em seus scripts. Em vez disso, as soluções propostas usam umsleep 1
entre as saídas subsequentes do timer ou um loop ocupado que produz o mais rápido possível. A primeira é inadequada porque, devido ao pequeno tempo gasto na impressão, a saída não ocorre de fato uma vez por segundo, mas um pouco menos do que a subótima. Após um tempo suficiente, o contador pulará um segundo. O último é inadequado porque mantém a CPU ocupada sem um bom motivo.A ferramenta que eu tenho na minha
$PATH
aparência é assim:O script pode ser usado como um cronômetro (contando até a interrupção) ou como um cronômetro que é executado pelo período de tempo especificado. Como o
sleep
comando é usado, este script permite especificar a duração pela qual contar com a mesma precisão que vocêsleep
permite. No Debian e derivados, isso inclui sub-segundos de espera e uma boa maneira legível por humanos para especificar a hora. Então, por exemplo, você pode dizer:E como você pode ver, o comando foi executado exatamente por 2 minutos e 4,6 segundos sem muita mágica no próprio script.
EDIT :
A ferramenta sleepenh vem do pacote com o mesmo nome no Debian e seus derivados como o Ubuntu. Para distribuições que não possuem, ele vem de https://github.com/nsc-deb/sleepenh
A vantagem do sono é que ele pode levar em consideração o pequeno atraso que se acumula ao longo do tempo do processamento de outras coisas além do sono durante um loop. Mesmo se alguém fizesse
sleep 1
um loop apenas 10 vezes, a execução geral levaria um pouco mais de 10 segundos por causa da pequena sobrecarga resultante da execuçãosleep
e da iteração do loop. Esse erro se acumula lentamente e, com o tempo, tornaria nosso cronômetro cada vez mais impreciso. Para corrigir esse problema, é necessário que cada iteração de loop calcule o tempo preciso para dormir, que geralmente é um pouco menos de um segundo (para temporizadores de intervalo de um segundo). A ferramenta sleepenh faz isso por você.fonte
sleep 0.1
. O que ésleepnh
(não consigo encontrá-lo nos repositórios do Arch) e como ele diferesleep
? Até onde eu sei, você está basicamente fazendo a mesma coisa que a minha resposta acima. o que estou perdendo?sleep 5
é que você não dorme por exatamente 5 segundos. Tente, por exemplo,time sleep 5
e você verá que a execução do comando leva um pouco mais de 5 segundos. Com o tempo, os erros se acumulam. O utilitário sleepenh permite evitar facilmente esse acúmulo de erros.sleepnh
é melhor do quesleep
(você apenas diz que outras respostas usamsleep 1
- o que elas não , apenas o OP usa isso) e ii) onde obtê-lo e como instalá-lo, pois não é uma ferramenta padrão.sleep
esleepenh
no primeiro parágrafo. De qualquer forma, eu provavelmente não estava claro o suficiente sobre isso, então expandi mais sobre isso no final. Os problemas de precisão em milissegundos são os que você obtém ao ligarsleep
uma vez. Eles se acumulam com o tempo e, em algum momento, é perceptível. Eu não disse que os outros usam apenassleep 1
. Eu disse que eles usamsleep 1
ou um busyloop. O que eles ainda fazem. Mostre-me um exemplo contrário. As respostassleep 0.1
são as mesmas que as respostas,sleep 1
exceto que acumulam erros ainda mais rapidamente.Resposta curta:
Explicação:
Sei que há muitas respostas, mas só quero postar algo muito próximo à pergunta do OP, que pessoalmente eu aceitaria como " contagem regressiva oneliner no terminal ". Meus objetivos eram:
Como funciona:
seq
imprime números de 60 a 1.echo -ne "\r$i "
retorna o sinal de intercalação para o início da sequência e imprime o$i
valor atual . Espaço depois que é necessário substituir o valor anterior, se for maior por caracteres do que o atual$i
(10 -> 9).fonte
Para referência futura, existe uma ferramenta de linha de comando chamada µTimer com opções muito simples de linha de comando para um temporizador de contagem regressiva / contagem regressiva.
fonte
Finja que você é uma pessoa do OSX procurando um cronômetro de linha de comando. Finja que você não deseja instalar as ferramentas gnu e apenas deseja executar com o unix
date
nesse caso, faça como o @terdon diz, mas com esta modificação:
fonte
Basta usar o relógio + data no horário UTC. Você também pode instalar algum pacote para exibição grande ...
Tente!
Consulte também http://www.cyberciti.biz/faq/create-large-colorful-text-banner-on-screen/
fonte
sw é um cronômetro simples que funcionará para sempre.
Instalar
Uso
fonte
Um exemplo de python:
fonte
Dê uma olhada no TermTime , é um bom relógio e cronômetro baseado em terminal:
pip install termtime
fonte
Isso é semelhante à resposta aceita, mas o Terdon
countdown()
me deu erros de sintaxe. Este funciona muito bem para mim, no entanto:function timer() { case "$1" in -s) shift;; *) set $(($1 * 60));; esac; local S=" "; for i in $(seq "$1" -1 1); do echo -ne "$S\r $i\r"; sleep 1; done; echo -e "$S\rTime's up!"; }
Você pode inseri-lo
.bashrc
e executar com:timer t
(onde t é o tempo em minutos).fonte
Encontrei essa pergunta hoje mais cedo, ao procurar um aplicativo de termo para exibir um grande cronômetro de contagem regressiva para um workshop. Nenhuma das sugestões era exatamente o que eu precisava, então rapidamente montei outra em Go: https://github.com/bnaucler/cdown
Como a pergunta já está suficientemente respondida, considere que isso é uma questão de posteridade.
fonte
$ sleep 1500 && xterm -fg amarelo -g 240x80 &
Quando esse grande terminal com texto amarelo saltar, é hora de levantar e esticar!
Notas: - 1500 segundos = pomodoro de 25 minutos - 240x80 = tamanho do terminal com linha de 240 caracteres e 80 linhas. Preenche uma tela para mim visivelmente.
Crédito: http://www.linuxquestions.org/questions/linux-newbie-8/countdown-timer-for-linux-949463/
fonte
Uma versão GUI do cronômetro
fonte
Se você desejar um programa compilável por qualquer motivo, o seguinte funcionará:
Isso também pode ser usado em outros programas e facilmente transportado, se um ambiente bash não estiver disponível ou se você preferir usar um programa compilado
github
fonte