Come mostrare un orologio in esecuzione nel terminale prima del prompt dei comandi


40

Preferisco usare il terminale e passare la maggior parte del tempo ad usarlo. Sto cercando un modo per vedere il tempo nel terminale mentre lo uso in parallelo. Il tempo cambierebbe automaticamente quando passa. Sarebbe fantastico se fosse visualizzato a sinistra al mio prompt dei comandi.

Se questo è il mio prompt dei comandi nel terminale:

saurav@saurav-P4I45Gx-PE:~$

Quindi vorrei vedere l'orologio (ora) come:

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

o

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

o qualsiasi altro formato. dov'è 06:27:01il tempo. Quello che voglio è solo mostrare il tempo che cambia quando passano i secondi.

Quindi c'è un modo per raggiungere questo obiettivo?


Potresti essere in grado di impostare la $PS1variabile (prompt) in modo da avere il tempo, ma non sono sicuro che cambi.
Kiri,

È possibile specificare \@, ma l'ora verrà ricalcolata solo ogni volta che viene visualizzato il prompt, non l'ora corrente.
Kiri,

2
@muru, Come ho specificato nella mia domanda, quella risposta funziona solo per zsh e non per bash.
Rosh_Th

2
Ma la domanda in sé non riguarda zsh (è generale), quindi ho consigliato a G_P di pubblicare la risposta lì. Con la risposta di G_P ora aggiunta lì, si qualifica come un duplicato.
Muru,

1
@muru quell'altra domanda vuole specificamente il tempo nel prompt. L'OP qui lo vuole solo stampato nel terminale e non specifica che deve essere nel prompt.
Terdon

Risposte:


74

Non sono sicuro che sia così semplice ottenerlo utilizzando la shell bash predefinita (ma non sto dicendo che sia impossibile). Probabilmente avrai bisogno di un comando / funzione in grado di aggiornare il prompt dei comandi ogni secondo senza interferire con qualsiasi cosa digiti sul prompt.

La shell Z (zsh) ha un comando integrato, chiamato zle, che, se usato con l' reset-promptargomento, forza la richiesta di ri-espansione, quindi rivisita il buffer di modifica.

Se si desidera provarlo, attenersi alla seguente procedura:

  1. Installa la shell Z con questo comando:

    sudo apt-get install zsh
    
  2. Quando corri zshper la prima volta, scegli 0quando ti viene chiesto.

  3. Modifica il ~/.zshrcfile e aggiungi le seguenti righe:

    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
    }
    

    Salva il file e chiudilo.

  4. Nel tuo terminale, quando stai ancora usando zsh, esegui source ~/.zshrc, o semplicemente zsh, per resettare il tuo prompt. Ora il tuo prompt dovrebbe apparire come:

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

    con alcuni colori.

  5. Se ti piace, esegui chsh -s /bin/zshper modificare la shell corrente in /bin/zsh(è necessario un nuovo accesso per rendere effettiva questa modifica).

  6. Esegui exitse vuoi uscire dalla shell zsh.

Ecco uno screencast di 15 secondi dal mio terminale:

esecuzione dell'orologio nel terminale prima del prompt dei comandi


4
Punti bonus per screencast. Roba davvero fantastica.
MadMike,

@SauravKumar Esegui chshper modificare la shell predefinita da /bin/basha /bin/zsh. Devi disconnetterti e riconnetterti.
Radu Rădeanu,

In realtà ce l'ho fatta .. Ma ogni volta che si apre un terminale devo eseguire il zshcomando per entrare in questa modalità orologio ..
Saurav Kumar,

@ RaduRădeanu: Sì, ha funzionato dopo il login così come il riavvio .. Sei fantastico .. Jai Ho !! : P
Saurav Kumar,

Questo non funziona per me. Dopo un secondo, chiude il terminale. Sono in Linux Mint, ma non pensavo che avrebbe avuto importanza poiché uso ancora zsh. Qualche idea?
Istrasci,

28

Se si desidera visualizzare il tempo di esecuzione nel proprio terminale, è possibile utilizzare questo comando. Visualizzerà l'ora nella parte in alto a destra del terminale.

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

inserisci qui la descrizione dell'immagine

Ma si noti che la visualizzazione del tempo usando questo comando a volte può sovrapporsi al testo presente nel terminale. Quindi usa questo comando con poca cautela.

Un altro modo potrebbe essere quello di usare il personaggio di controllo in PS1

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

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

Ma in questo metodo il tuo tempo si aggiornerà solo dopo aver premuto Invio.

Se vuoi sopra il metodo permanente aggiungi il comando sopra (quello che ti piace o entrambi) nel tuo ~.bashrcfile.


Grande! Qualche indizio su come cambiare il colore dell'orologio?
Calculus Knight,

1
@CalculusKnight, puoi cambiare il codice colore nel comando. Puoi fare riferimento per questo codice colore. misc.flogisoft.com/bash/tip_colors_and_formatting
g_p

1
Funziona PERFETTAMENTE - grazie mille. Lo chiamo da .bashrc per impedire a un firewall troppo proattivo di uccidere connessioni SSH inattive.
Criggie,

11

Se tutto ciò che vuoi fare è mostrare un orologio, basta usare date:

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

Ciò mostrerà l'ora ogni secondo fino a quando non la fermerai CtrlC. Se vuoi che si trovi sulla stessa riga (quanto sopra stamperà una nuova riga ogni secondo), fai invece questo:

while :; do printf '%s\r' "$(date +%r)"; sleep 1 ; done

2

Questa domanda mi ha infastidito per alcuni giorni, ed ecco il mio post modificato con tutto il materiale che ho imparato. In particolare, il mio obiettivo era quello di ottenere la visualizzazione dell'orologio accanto al prompt in BASH. Proprio come Radu Radeanu menzionato nella sua risposta, la chiave è trovare una funzione o una variabile in grado di aggiornare costantemente il prompt dei comandi o ridisegnare lo schermo, senza interferire con lo schermo o con qualsiasi cosa digiti. Mentre, questo è possibile ottenere con ciclo while, come mostrato da G_P, il costante ridisegno dello schermo con la funzione tput fa confusione con qualsiasi testo sia sullo schermo nel momento in cui si aggiorna. Mi sono avvicinato molto al raggiungimento di ciò che l'OP ha chiesto modificando in qualche modo il codice pubblicato da G_P, ma credo comunque che la risposta di Radu sia la più vicina a ciò che l'OP vuole. Senza ulteriori indugi, ecco alcune delle cose che

# 1, La mia soluzione preferita: Terminal Multiplexer

Il multiplexer terminale è un software che consente di dividere la schermata del terminale in due o più schermate. In particolare, voglio attirare l'attenzione sul terminale Byobu. Questo emulatore di terminale basato su ncurses, consente di mostrare il tempo, la percentuale della CPU, la memoria e un sacco di altri indicatori. Nella schermata del mio terminale byobu puoi vedere la temperatura della CPU, la percentuale della batteria, la qualità della connessione Internet, la frequenza della CPU, la RAM, la data e, naturalmente, l'ora. Se sei principalmente preoccupato di monitorare costantemente queste cose mentre sei nel terminal, Byobu è la strada da percorrere. In effetti, mi è piaciuto così tanto, l'ho impostato per il caricamento automatico durante l'accesso a tty. L'unica stranezza è che in tty non puoi davvero unire le finestre separate - passa solo da una scheda all'altra con i tasti F3 e F4.

Schermata del mio terminale byobu

Una soluzione alternativa che coinvolge finestre multiplexing è l'utilizzo splitvt, che divide lo schermo in due parti. È possibile eseguire un terminale come tty-clock, ad esempio , utilizzare il comando watch con date oppure è possibile codificarne uno da soli con uno script. Ne parleremo più avanti. Nello screenshot puoi vedere una parte della divisione con il normale prompt di bash in alto, e in quella inferiore puoi vedere uno script in esecuzione, che aggiorna costantemente l'output del datecomando con il clearcomando.

inserisci qui la descrizione dell'immagine

# 2, While Do Loop e tput Questo è probabilmente il più vicino a ciò che la persona che ha posto la domanda voleva implementare con bash.

G_P ha pubblicato un'ottima soluzione che coinvolge i comandi while doe tput. Tuttavia nel codice di G_P c'erano due cose che non mi piacevano. Uno, l'orologio era a destra del prompt e due - poiché il ciclo di sospensione è di 1 secondo (fare riferimento al codice originale in cui si dice sospensione), lo schermo viene ridisegnato ogni secondo e questo rovina il mio output. Quello che ho fatto è stato modificare il mio prompt di bash in modo che fosse inferiore di una riga con l'operatore \ n e cambiare il codice di G_P in modo che l'operatore tput posizionasse l'orologio proprio sopra il prompt e si aggiornasse ogni 60 secondi; che mi permette di vedere ore e minuti (e non mi interessa esattamente i minuti), mentre il ciclo dell'orologio non rovina il mio schermo. Innanzitutto, ecco il mio prompt:

PS1='${debian_chroot:+($debian_chroot)}\n[*\u@Ubuntu*]\n $(date) :\w\$  ' 

Ed ecco il codice modificato di G_P: enter code here

 while sleep 60;do tput sc;tput cup 0 0;date +%R;tput rc;done &

Piccola modifica : ho notato che questo codice sopra non porta subito l'orologio a volte. Ecco una versione migliore: while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done & questa prima posiziona l'orologio sullo schermo, quindi fa sapere a bash di passare attraverso il ciclo del sonno di 60 secondi

Nota, la tput cup 0 0 posiziona l'orologio nell'angolo in alto a destra dello schermo, proprio sopra il mio prompt e sleep 60 cambia il ciclo di sleep in 60 secondi, perché in questo modo posso monitorare solo ore e minuti anziché ogni secondo. In questo modo, qualsiasi testo che ho sullo schermo non è interessato, per la maggior parte (solo quando mi capita di eseguire un comando nello stesso momento in cui si aggiorna l'orologio).

inserisci qui la descrizione dell'immagine

La linea PS1 è già nel tuo profilo .bashrc, quindi devi solo modificarlo un po '. Il ciclo while do dovrebbe essere aggiunto da qualche parte nello stesso file, preferibilmente alla fine con # comment che questa è roba che hai aggiunto inizialmente. E non dimenticare di eseguire sempre il backup di qualsiasi file del genere nel caso in cui tu faccia bubu e debba tornare indietro com'era.

# 3, Scripting e altro

Questa parte è solo per coloro che vogliono vedere il tempo. Per coloro che vogliono monitorarlo costantemente, # 1 e # 2 sono le opzioni preferite.

Quindi, come abbiamo già visto, il ciclo while do è piuttosto utile. Ecco come è possibile creare un orologio con comandi do do loop, date e sleep.

inserisci qui la descrizione dell'immagine

Premi Invio / Invio e in pratica vedrai l'output del comando data mostrato sullo schermo cancellato ogni secondo. Se non vuoi scrivere tutto questo ogni volta, trasforma tutto questo in script:

#!/bin/bash

while true
do
clear;date
sleep 1
done

Ora puoi eseguire quello script con splitvt in un'istanza di bash, mentre lavori nell'altra.

Un'altra soluzione è il watch -n1 datecomando, che eseguirà continuamente il comando data con un periodo di 1 secondo.

In conclusione: ho imparato alcune cose mentre cercavo di trovare la risposta a questa domanda e spero che i miei risultati ti abbiano aiutato in qualche modo e spero di essere stato in grado di contribuire a questa domanda. Byobu terminal IMHO è la soluzione migliore, ma decidi tu stesso, fai qualche ricerca e scegli il modo migliore per te.

Alcune delle cose che ho trovato durante la ricerca:

Il mio post originale, la soluzione minimalista: modifica il tuo file ~ / .bashrc. Preferisco modificarlo con nano, quindi

nano ~/.bashrc

Ecco la parte del mio file modificato:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\$'    
else
   # PS1='${debian_chroot:+($debian_chroot)}[*\u@Ubuntu*]:\w\$ '
    PS1='${debian_chroot:+($debian_chroot)}[*\u@Ubuntu*]\t:\w\$ '
fi

Dopo la frase else la prima riga è commentata con # (questo è il mio vecchio prompt), ora la seconda riga è quella desiderata, e in particolare l' \toperatore. Ciò mostra il tempo di esecuzione nel formato 24 ore. Per maggiori informazioni, dai un'occhiata a questo . Anche una piccola nota, sto usando le cose dopo l'altro, perché non sto usando il prompt colorato.

PS: Per favore fatemi sapere se dovrei aggiungere qualcosa alla mia risposta o modificarla in alcun modo, ma per la maggior parte credo che questa sia la risposta più conclusiva che potrei trovare, e almeno non aggiungerò personalmente nulla nuovo ad esso.


1
Questo non visualizzerà un orologio "in esecuzione" come vuole l'OP. Aggiungerà semplicemente il tempo al prompt del terminale.
Parto,

2
export PS1='\t$'

perché preferisco la visualizzazione come sfondo po 'di informazioni possibile sul terminale i generalmente personalizzare ogni sessione come #, $e così via (se si vuole cambiare in modo permanente, la soluzione di minerz029 è perfetto)

Per modificarlo per mostrare corrente, potrei andare per

export PS1='\T$'

per l'ora nel formato 12 ore. È possibile visualizzare la documentazione di bash per altre opzioni.


1

Questa volta cambierà solo quando viene eseguito un nuovo prompt

Puoi aggiungere quanto segue al tuo .bashrc:

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

Che produrrà:

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

Maggiori informazioni qui: http://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/#8

Cerca "8. Crea il tuo prompt usando i codici disponibili per la variabile PS1" nella pagina sopra.


2
Apprezzo il tuo tempo e il tuo impegno, ma questo non è quello che voglio ..
Saurav Kumar,

@SauravKumar Sì, ho capito che vuoi un orologio in esecuzione . Non sono sicuro che sia possibile con la variabile 'PS1', forse $PROMPT_COMMANDfunzionerebbe se riesci a trovare un comando che mostra il tempo di ticking.
Kiri,

Beh, penso che tu possa farlo .. :) Sembra che tu abbia raggiunto vicino alla soluzione ..
Saurav Kumar,

perché include \ u due volte? @SauravKumar
David

@ David: mi dispiace, non lo so. Ma @ minerz029 probabilmente risponderebbe alla tua domanda. :)
Saurav Kumar l'

1

Mi piace molto la funzione orologio ncmpcpp , attivata da 0-key (vedi screenshot). Per maggiori dettagli sulla procedura di installazione, fare riferimento a questo post .

inserisci qui la descrizione dell'immagine


1
watch -t -n1 "date +%T|figlet" sarebbe un modo semplice.
g_p,

1

Influenzato da g_p e Serg, ho provato a creare una funzione in bash. Funziona, ma non sono sicuro che sia una buona idea controllare il comando ps ogni secondo per vedere se bash è un processo fg o no

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&
}

0

Se non hai mai bisogno di usarlo debian_chroot, è un posto utile per impostare l'ora in cui è stato visualizzato il prompt dei comandi usando:

export PROMPT_COMMAND='debian_chroot=$(date +%r)'

Digita questo nel tuo terminale e guarda il tuo prompt dei comandi cambiare con il tempo:

rick@alien:~$ export PROMPT_COMMAND='debian_chroot=$(date +%r)'

(09:14:59 PM)rick@alien:~$ 

Dopo aver impostato l'ora una volta, per ottenere un orologio in esecuzione che aggiorni ogni secondo utilizzo:

while sleep 1;do tput sc;tput cup $(($(tput lines)-1)) 1;printf `date +%r`;tput rc;done &

Questo .gifmostra i comandi in azione:

Time terminal prompt.gif

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.