Essa pergunta tem me incomodado há alguns dias, e aqui está meu post editado com todo o material que aprendi. Especificamente, meu objetivo era conseguir mostrar o relógio ao lado do prompt no BASH. Assim como Radu Radeanu mencionou em sua resposta, a chave é encontrar uma função ou variável que seja capaz de atualizar constantemente o prompt de comando ou redesenhar a tela, sem interferir na sua tela ou com o que você digitar. Embora isso seja possível com loop while, como mostrado por G_P, o redesenho constante da tela com a função tput atrapalha com qualquer texto que esteja na minha tela no momento em que ele é atualizado. Cheguei perto de conseguir o que o OP pediu modificando um pouco o código que o G_P postou, mas ainda acredito que a resposta de Radu é a mais próxima do que o OP quer. Sem mais delongas, eis algumas das coisas que aprendi, apresentadas para o seu julgamento.
# 1, Minha solução preferida: Multiplexador de terminais
O multiplexador de terminais é um software que permite dividir a tela do terminal em duas ou mais telas. Em particular, quero chamar a atenção para o terminal Byobu. Este emulador de terminal baseado em ncurses, permite que você mostre o tempo, porcentagem de CPU, memória e um monte de outros indicadores. Na captura de tela do meu terminal byobu você pode ver a temperatura da bateria, a porcentagem da bateria, a qualidade da conexão à Internet, a freqüência da CPU, a RAM, a data e, claro, o tempo. Se você está preocupado em monitorar constantemente essas coisas enquanto está no terminal, Byobu é o caminho a percorrer. Na verdade, eu gostei muito disso, configurei para carregar automaticamente enquanto faço login no tty. A única peculiaridade é que em tty você não pode realmente mesclar as janelas separadas - apenas alternar entre as guias com as teclas F3 e F4.
Uma solução alternativa envolvendo janelas de multiplexação é usando splitvt
, que divide a tela em duas partes. Você pode executar um relógio terminal como tty-clock
, usar o comando watch com data ou codificar um com um script. Mais sobre isso depois.
Na captura de tela, você pode ver uma parte da divisão com o prompt bash normal na parte superior e, na parte inferior, ver um script em execução, que atualiza constantemente a saída do comando date
com o comando clear
.
# 2, While Do Loop e tput
Este é provavelmente o encerramento do que a pessoa que fez a pergunta queria implementada com o bash.
G_P postou uma ótima solução envolvendo os comandos while do
e tput
. No entanto, no código do G_P havia duas coisas que eu não gostei. Um, o relógio estava à direita do prompt, e dois - porque o ciclo de sono é de 1 segundo (consulte o código original onde diz sleep), a tela é redesenhada a cada segundo, e isso atrapalha minha saída. O que eu fiz, é editar meu prompt bash para ser uma linha inferior com o operador \ n e alterar o código do G_P para que o operador de tput posicione o relógio logo acima do prompt e atualize a cada 60 segundos; que me permite ver horas e minutos (e eu não me importo com minutos), enquanto o loop do relógio não atrapalha minha tela. Primeiro, aqui está o meu prompt:
PS1='${debian_chroot:+($debian_chroot)}\n[*\u@Ubuntu*]\n $(date) :\w$ '
E aqui está o código modificado do G_P: enter code here
while sleep 60;do tput sc;tput cup 0 0;date +%R;tput rc;done &
Edição pequena : Eu notei que este código acima não traz o relógio imediatamente, às vezes. Aqui está uma versão melhor: while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done &
Este coloca o relógio na tela primeiro, depois deixa o bash saber passar pelo ciclo de sono de 60 segundos
Note que o tput cup 0 0 coloca o relógio no canto superior direito da tela, logo acima do meu prompt e o sleep 60 muda o ciclo do sleep para 60 segundos, porque dessa forma eu posso monitorar apenas horas e minutos ao invés de cada segundo. Dessa forma, qualquer que seja o texto que eu tenha na tela não é afetado, na maioria das vezes (somente quando acontecer de eu executar um comando o mesmo relógio de tempo é atualizado).
A linha PS1 já está no seu perfil .bashrc, então você só precisa ajustá-la um pouco. O while do loop deve ser adicionado em algum lugar no mesmo arquivo, preferencialmente no final com # comment que isso é coisa que você adicionou inicialmente. E não se esqueça de sempre fazer o backup de qualquer arquivo como esse para o caso de você fazer bubu e precisar voltar ao jeito que era.
# 3, scripts e outros
Esta parte é meramente para aqueles que querem ver o tempo. Para aqueles que querem monitorá-lo constantemente, # 1 e # 2 são opções preferidas.
Então, como já vimos, o while do loop é bastante útil. Veja como você pode criar um relógio com os comandos while loop, date e sleep.
Pressione Enter / Enter, e você basicamente verá o comando de saída de data mostrado na tela limpa a cada segundo.Se você não quiser digitar tudo isso todas as vezes, transforme tudo isso em script:
#!/bin/bash
while true
do
clear;date
sleep 1
done
Agora você pode executar esse script com splitvt em uma instância do bash, enquanto trabalha no outro.
Outra solução é o comando watch -n1 date
, que executará continuamente o comando date com o período de 1 segundo.
Em Conclusão: aprendi algumas coisas ao tentar encontrar a resposta para essa pergunta, e espero que minhas descobertas tenham ajudado você de alguma forma, e espero ter contribuído com isso questão. Byobu terminal IMHO é a melhor solução, mas decida por si mesmo, faça algumas pesquisas e escolha o que for melhor para você.
Algumas das coisas que encontrei enquanto pesquisava:
Minha postagem original, a solução minimalista: Edite seu arquivo ~ / .bashrc. Eu prefiro editá-lo com nano, então
nano ~/.bashrc
Aqui está a parte do meu próprio arquivo editado:
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[$'
else
# PS1='${debian_chroot:+($debian_chroot)}[*\u@Ubuntu*]:\w$ '
PS1='${debian_chroot:+($debian_chroot)}[*\u@Ubuntu*]\t:\w$ '
fi
Depois de mais uma declaração, a primeira linha é comentada com # (este é o meu antigo prompt), agora a segunda linha é a que você quer, e especificamente \t
operator. Isso mostra o tempo de execução no formato de 24 horas. Para mais informações, confira this . Também uma pequena nota, eu estou usando o material depois, porque eu não estou usando prompt colorido.
PS: Por favor, deixe-me saber se devo acrescentar alguma coisa à minha resposta ou editá-la de qualquer forma, mas na maior parte eu acredito que esta é a resposta mais conclusiva que eu poderia chegar, e pelo menos eu pessoalmente não vou adicionar nada de novo a ele.