Como mostrar um relógio em execução no terminal antes do prompt de comando

29

Eu prefiro usar o terminal e passar a maior parte do tempo usando-o. Eu estou procurando uma maneira de ver o tempo no terminal enquanto eu uso paralelamente. O tempo mudaria automaticamente quando passasse. Seria incrível se ele fosse exibido no meu prompt de comando.

Se este é o meu prompt de comando no terminal:

saurav@saurav-P4I45Gx-PE:~$

Então eu gostaria de ver o relógio (time) como:

saurav@saurav-P4I45Gx-PE[06:27:01]:~$

ou

saurav@(06:27:01):~$

ou qualquer outro formato. onde 06:27:01 é a hora. O que eu quero é apenas mostrar o tempo que muda quando os segundos passam.

Então, há alguma maneira de conseguir isso?

    
por Saurav Kumar 17.10.2013 / 03:11

8 respostas

58

Não tenho certeza se é tão simples conseguir isso usando o bash shell padrão (mas não estou dizendo que é impossível). Você provavelmente precisará de um comando / função que seja capaz de atualizar o prompt de comando a cada segundo sem interferir com qualquer coisa que você digitar no prompt.

O z shell (zsh) possui um comando interno, chamado zle , que, quando usado com o argumento reset-prompt , força o prompt a ser reexpandido e, em seguida, exibe novamente o buffer de edição.

Se você quiser tentar, use as seguintes etapas:

  1. Instale o shell Z com este comando:

    sudo apt-get install zsh
    
  2. Quando você executar zsh pela primeira vez, escolha 0 quando for solicitado.

  3. Edite o arquivo ~/.zshrc (executando gedit ~/.zshrc ) e adicione as seguintes linhas:

    setopt PROMPT_SUBST
    PROMPT='%B%F{red}%n@%m%f%F{yellow}[%D{%L:%M:%S}]%f:%F{blue}${${(%):-%~}}%f$ %b'
    TMOUT=1
    
    TRAPALRM() {
        zle reset-prompt
    }
    

    Salve o arquivo e feche-o.

  4. No seu terminal, quando você ainda estiver usando o zsh, execute source .zshrc para redefinir o seu prompt. Agora seu prompt deve se parecer com:

    saurav@saurav-P4I45Gx-PE[1:25:21]:~$
    

    com algumas cores.

  5. Se você gostar, execute chsh -s /bin/zsh para alterar seu shell atual para /bin/zsh (um novo logon é necessário para que essa alteração tenha efeito).

  6. Execute exit se você quiser sair do shell zsh.

Aqui está um screencast de 15 segundos do meu terminal:

    
por Radu Rădeanu 17.10.2013 / 10:54
24

Se você quiser exibir o tempo de execução no seu terminal, você pode usar este comando. Ele exibirá a hora no lado superior direito do seu terminal.

  while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-11));echo -e "\e[31m'date +%r'\e[39m";tput rc;done &

Mas observe que a exibição da hora usando este comando em algum momento pode se sobrepor ao texto presente no terminal. Então use este comando com pouca cautela.

Outra maneira pode estar usando o caractere de controle no PS1

[guru@guru-pc ~]$  PS1='\[\u@\h \T \w]$'

[guru@guru-pc 11:06:16 ~]$

Mas neste método, seu tempo será atualizado somente depois de pressionar Enter.

Se você quiser acima do método permanente, adicione o comando acima (o que você gosta ou ambos) no seu arquivo ~.bashrc .

    
por g_p 20.09.2014 / 09:23
9

Se tudo o que você quiser fazer é mostrar um relógio, use apenas date :

while :; do date +%r; sleep 1 ; done

Isso mostrará a hora a cada segundo até você parar com Ctrl C . Se você quiser que ele esteja na mesma linha (o acima irá imprimir uma nova linha a cada segundo), faça isso:

while :; do printf '%s\r' "$(date +%r)"; sleep 1 ; done
    
por terdon 20.09.2014 / 13:43
2

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.

    
por Sergiy Kolodyazhnyy 20.09.2014 / 10:08
1

Este tempo só mudará quando um novo prompt for executado

Você pode adicionar o seguinte ao seu .bashrc :

export PS1="\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:[\t]:\w$ "

Que produzirá:

USER@HOST:[12:59:59]:~$ _

Mais informações aqui: link

Procure "8. Crie seu próprio prompt usando os códigos disponíveis para a variável PS1" na página acima.

    
por kiri 17.10.2013 / 03:44
1

Eu realmente gosto do recurso de relógio ncmpcpp , acionado pela tecla 0 -key (veja a imagem). Para mais detalhes sobre o procedimento de instalação, consulte este post .

    
por v2r 20.09.2014 / 11:38
1
export PS1='\t$'

desde que prefiro exibir o mínimo possível de informações de segundo plano no terminal eu costumo personalizar cada sessão como # , $ , etc. (se você quiser alterá-lo permanentemente, a solução da minerz029 é perfeita)

Para modificá-lo para mostrar atual, eu poderia ir para

export PS1='\T$'

por tempo no formato de 12 horas. Você pode ver a documentação bash para outras opções.

    
por Sojourner 14.10.2014 / 22:59
1

Influenciado por g_p e Serg tentei criar a função no bash. Funciona, mas não tenho certeza se é uma boa idéia verificar o comando ps a cada segundo para ver se o bash é um processo fg ou não

prompttime() {
  PSCOLGREEN="\[$(tput setaf 2)\]"
  PSCOLRESET="\[$(tput sgr0)\]"
  PS1="${PSCOLGREEN}\$ ${PSCOLRESET}[--:--:-- \W] "
  [ "$PROMPTCURRTTY" ] || {
    PROMPTCURRTTYtemp=$(tty)
    PROMPTCURRTTY=${PROMPTCURRTTYtemp//\/dev\//}
    unset PROMPTCURRTTYtemp; }
  PROMPTSTATE="[S]s+"
  while :; do
    sleep 1
    [ "$(ps a | grep "${PROMPTCURRTTY}.*${PROMPTSTATE}.*$(basename $SHELL)")" ] &&
    { tput sc
      tput hpa 3
      echo -en "$(date +%T)"
      tput rc; }
    continue
  done&
}
    
por Alex Sweetheart 08.11.2016 / 12:16