Comment afficher une horloge en cours d'exécution dans le terminal avant l'invite de commande

31

Je préfère utiliser terminal et passer le plus clair de mon temps à l’utiliser. Je cherche un moyen de voir l'heure dans le terminal pendant que je l'utilise en parallèle. Le temps changerait automatiquement quand il passe. Ce serait génial si elle était affichée à gauche de mon invite de commande.

S'il s'agit de mon invite de commande dans le terminal:

[email protected]:~$

Alors je voudrais voir l’horloge comme:

[email protected][06:27:01]:~$

ou

[email protected](06:27:01):~$

ou tout autre format. où 06:27:01 est le temps. Ce que je veux, c’est juste pour montrer le temps qui change quand les secondes passent.

Y a-t-il un moyen d'y parvenir?

    
posée Saurav Kumar 17.10.2013 - 03:11
la source

8 réponses

60

Je ne suis pas sûr que ce soit si simple de réaliser cela en utilisant le shell bash par défaut (mais je ne dis pas que c'est impossible). Vous aurez probablement besoin d'une commande / fonction capable d'actualiser l'invite de commande toutes les secondes sans interférer avec tout ce que vous tapez à l'invite.

Le shell Z (zsh) comporte une commande intégrée, appelée zle , qui, utilisée avec L'argument reset-prompt force le redimensionnement de l'invite, puis réaffiche le tampon d'édition.

Si vous voulez l'essayer, procédez comme suit:

  1. Installez le shell Z avec cette commande:

    sudo apt-get install zsh
    
  2. Lorsque vous exécutez zsh pour la première fois, choisissez 0 lorsque vous êtes invité.

  3. Modifiez le fichier ~/.zshrc et ajoutez les lignes suivantes:

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

    Enregistrez le fichier et fermez-le.

  4. Dans votre terminal, lorsque vous utilisez toujours zsh, exécutez source ~/.zshrc ou simplement zsh pour réinitialiser votre invite. Maintenant, votre invite devrait ressembler à:

    [email protected][1:25:21]:~$
    

    avec quelques couleurs.

  5. Si vous l’aimez, exécutez chsh -s /bin/zsh pour changer votre shell actuel en /bin/zsh (une nouvelle connexion est requise pour que cette modification prenne effet).

  6. Exécutez exit si vous souhaitez quitter le shell zsh.

Voici un screencast de 15 secondes depuis mon terminal:

    
réponse donnée Radu Rădeanu 17.10.2013 - 10:54
la source
25

Si vous souhaitez afficher le temps d’exécution dans votre terminal, vous pouvez utiliser cette commande. Il affichera l'heure dans le coin supérieur droit de votre terminal.

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

Notez que l'affichage de l'heure en utilisant cette commande peut parfois chevaucher le texte présent dans le terminal. Donc, utilisez cette commande avec peu de prudence.

Une autre façon d’utiliser le caractère de contrôle dans le PS1

[[email protected] ~]$  PS1='\[\[email protected]\h \T \w]$'

[[email protected] 11:06:16 ~]$

Mais dans cette méthode, votre temps sera actualisé uniquement après avoir appuyé sur Entrée.

Si vous souhaitez que la méthode ci-dessus soit permanente, ajoutez la commande ci-dessus (celle que vous aimez ou les deux) dans votre fichier ~.bashrc .

    
réponse donnée g_p 20.09.2014 - 09:23
la source
10

Si tout ce que vous voulez faire est de montrer une horloge, utilisez simplement date :

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

Cela affichera l'heure chaque seconde jusqu'à ce que vous l'arrêtiez avec Ctrl C . Si vous voulez qu'il soit sur la même ligne (ce qui précède imprimera une nouvelle ligne à chaque seconde), faites-le plutôt:

while :; do printf '%s\r' "$(date +%r)"; sleep 1 ; done
    
réponse donnée terdon 20.09.2014 - 13:43
la source
2

Cette question me préoccupe depuis quelques jours et voici mon post édité avec tout le matériel que j'ai appris. Plus précisément, mon objectif était de faire apparaître l'horloge à côté de l'invite dans BASH. Tout comme Radu Radeanu mentionné dans sa réponse, l’essentiel est de trouver une fonction ou une variable capable de rafraîchir constamment l’invite de commandes ou de redessiner l’écran, sans interférer avec votre écran ou avec tout ce que vous tapez. Bien que cela soit possible avec while loop, comme montré par G_P, le redessinage constant de l'écran avec la fonction tput perturbe le texte qui est sur mon écran au moment où il est rafraîchi. Je suis sur le point d’atteindre ce que l’OP a demandé en modifiant quelque peu le code affiché par G_P, mais je pense néanmoins que la réponse de Radu est la plus proche de ce que veut OP. Sans plus tarder, voici certaines des choses que j'ai apprises, présentées pour votre jugement.

# 1, ma solution préférée: multiplexeur de terminaux

Le multiplexeur de terminal est un logiciel qui permet de diviser l'écran du terminal en plusieurs écrans. En particulier, je souhaite attirer l'attention sur le terminal Byobu. Cet émulateur de terminal basé sur ncurses vous permet d'afficher l'heure, le pourcentage de processeur, la mémoire et toute une série d'autres indicateurs. Dans la capture d'écran de mon terminal byobu, vous pouvez voir la température du processeur, le pourcentage de la batterie, la qualité de la connexion Internet, la fréquence du processeur, la RAM, la date et le temps de parcours. Si vous êtes principalement préoccupé par la surveillance constante de ces choses dans le terminal, Byobu est la voie à suivre. En fait, je l'aime tellement, je l'ai configuré pour qu'il se charge automatiquement lors de la connexion à tty. Le seul caprice est que dans tty vous ne pouvez pas réellement fusionner les fenêtres séparées - ne changez que les onglets avec les touches F3 et F4.

Une autre solution impliquant le multiplexage des fenêtres consiste à utiliser splitvt , qui divise l'écran en deux parties. Vous pouvez exécuter une horloge de terminal telle que tty-clock , utiliser la commande watch avec la date ou vous pouvez en coder une vous-même avec un script. Plus sur cela plus tard. Dans la capture d'écran, vous pouvez voir une partie de la partition avec une invite normale bash, et dans la partie inférieure, un script s'exécute, qui actualise constamment la sortie de la commande date avec la commande clear .

# 2, While Do Loop et tput C'est probablement la fin de ce que la personne qui a posé la question voulait implémenter avec bash.

G_P a publié une excellente solution impliquant les commandes while do et tput . Cependant, dans le code de G_P, il y avait deux choses que je n'aimais pas. Un, l'horloge était à droite de l'invite, et deux - parce que le cycle de sommeil est 1 seconde (se référer au code d'origine où il est dit sommeil), l'écran est redessiné chaque seconde, et cela perturbe ma sortie. Ce que j'ai fait, c'est éditer mon invite bash pour qu'il soit plus bas d'une ligne avec l'opérateur \ n et changer le code de G_P pour que l'opérateur tput place l'horloge juste au-dessus de l'invite et se rafraîchit toutes les 60 secondes; cela me permet de voir des heures et des minutes (et je ne me soucie pas vraiment des minutes), alors que la boucle de l'horloge ne me gâche pas l'écran. Tout d'abord, voici mon invite:

PS1='${debian_chroot:+($debian_chroot)}\n[*\[email protected]*]\n $(date) :\w$  ' 

Et voici le code modifié de G_P: enter code here

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

Small edit : J'ai remarqué que ce code ci-dessus ne fait pas apparaître l’horloge tout de suite. Voici une meilleure version: while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done & Celui-ci place l'horloge à l'écran en premier, puis laisse savoir à travers le cycle de sommeil de 60 secondes

Remarque: le tput cup 0 0 place l’horloge dans le coin supérieur droit de l’écran, juste au-dessus de mon message et veille à 60 changements de sommeil, ce qui me permet de surveiller uniquement les heures et les minutes. De cette façon, quel que soit le texte que j'ai sur l'écran ne soit pas affecté, pour la plupart (seulement quand il m'arrive d'exécuter une commande, la même horloge est actualisée).

La ligne PS1 est déjà dans votre profil .bashrc, il vous suffit donc de la modifier un peu. La boucle while do devrait être ajoutée quelque part dans le même fichier, de préférence à la fin avec un commentaire indiquant que ceci a été ajouté initialement. Et n'oubliez pas de toujours sauvegarder un fichier comme celui-ci au cas où vous feriez du bubu et que vous deviez revenir à sa forme initiale.

# 3, Scripting et autres

Cette partie est simplement pour ceux qui veulent voir le temps. Pour ceux qui veulent le surveiller en permanence, les options n ° 1 et n ° 2 sont préférées.

Comme nous l’avons déjà vu, la boucle while do est très utile. Voici comment vous pouvez créer une horloge avec des commandes while, loop, date et sleep.

Appuyez sur Entrée / Retour et vous verrez en gros la sortie de la commande de date affichée sur l’écran effacé toutes les secondes.Si vous ne voulez pas taper tout cela à chaque fois, transformez tous ces éléments en script:

#!/bin/bash

while true
do
clear;date
sleep 1
done

Maintenant, vous pouvez exécuter ce script avec splitvt dans une instance de bash, tout en travaillant dans l’autre.

Une autre solution est la commande watch -n1 date , qui exécutera continuellement la commande de date avec une période de 1 seconde.

En conclusion: J'ai appris certaines choses en essayant de trouver la réponse à cette question, et j'espère que mes découvertes vous ont aidé d'une manière ou d'une autre, et j'espère que j'ai pu y contribuer. question. Byobu terminal IMHO est la meilleure solution, mais décidez vous-même, faites des recherches et choisissez la méthode qui vous convient le mieux.

Certaines des choses que j'ai trouvées lors de mes recherches:

Mon article original, la solution minimaliste: modifiez votre fichier ~ / .bashrc. Je préfère le modifier avec nano, donc

nano ~/.bashrc

Voici la partie de mon propre fichier édité:

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

Après une autre déclaration, la première ligne est mise en commentaire avec # (ceci est mon ancienne invite), maintenant la deuxième ligne est celle que vous voulez, et spécifiquement l'opérateur \t . Cela montre le temps d'exécution au format 24 heures. Pour plus d'informations, consultez this . Aussi une petite note, j'utilise les choses après tout, parce que je n'utilise pas d'invite de couleur.

PS: Faites-moi savoir si je devrais ajouter quelque chose à ma réponse ou la modifier de quelque façon que ce soit, mais je pense que c'est la réponse la plus concluante que je pourrais trouver. Au moins, personnellement, je n’y ajouterai rien de nouveau.

    
réponse donnée Sergiy Kolodyazhnyy 20.09.2014 - 10:08
la source
2
export PS1='\t$'

comme je préfère afficher aussi peu d’informations d’arrière-plan que possible sur le terminal, je personnalise généralement chaque session en # , $ , etc. >

Pour le modifier pour afficher le courant, je pourrais aller pour

export PS1='\T$'

pour l'heure au format 12 heures. Vous pouvez voir la documentation bash pour d'autres options.

    
réponse donnée Sojourner 14.10.2014 - 22:59
la source
1

Cette fois-ci, cela changera seulement si une nouvelle invite est exécutée

Vous pouvez ajouter les éléments suivants à votre .bashrc :

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

Qui produira:

[email protected]:[12:59:59]:~$ _

Plus d’informations ici: lien

Recherchez "8. Créez votre propre invite en utilisant les codes disponibles pour la variable PS1" dans la page ci-dessus.

    
réponse donnée kiri 17.10.2013 - 03:44
la source
1

J'aime beaucoup la fonction d'horloge ncmpcpp , déclenchée par la touche 0 (voir capture d'écran). Pour plus de détails sur la procédure d’installation, veuillez vous reporter à cette publication .

    
réponse donnée v2r 20.09.2014 - 11:38
la source
1

Influencé par g_p et Serg , j'ai essayé de créer une fonction dans bash. Cela fonctionne, mais je ne suis pas sûr que ce soit une bonne idée de vérifier la commande ps toutes les secondes pour voir si bash est un processus fg ou non.

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&
}
    
réponse donnée Alex Sweetheart 08.11.2016 - 12:16
la source

Lire d'autres questions sur les étiquettes