48 votes

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

Je préfère utiliser le terminal et j'y passe le plus clair de mon temps. Je cherche un moyen de voir le temps passé dans le terminal pendant que je l'utilise en parallèle. L'heure changerait automatiquement quand elle passe. Ce serait génial si cela pouvait s'afficher à gauche de mon invite de commande.

Si c'est mon invite de commande dans le terminal :

saurav@saurav-P4I45Gx-PE:~$

Dans ce cas, j'aimerais voir clock(time) comme :

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

o

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

ou tout autre format. où 06:27:01 est le temps. Ce que je veux, c'est simplement afficher l'heure qui change au fur et à mesure que les secondes s'écoulent.

Existe-t-il un moyen d'y parvenir ?

90voto

Radu Rădeanu Points 156862

Je ne suis pas sûr qu'il soit si simple d'y parvenir en utilisant le Shell par défaut de bash (mais je ne dis pas que c'est impossible). Vous aurez probablement besoin d'une commande/fonction capable de rafraîchir l'invite de commande toutes les secondes sans interférer avec ce que vous tapez dans l'invite.

En Z Shell (zsh) dispose d'une commande intégrée, appelée zle qui, lorsqu'il est utilisé avec le reset-prompt force l'invite à se développer à nouveau, puis réaffiche le tampon d'édition.

Si vous voulez l'essayer, suivez les étapes suivantes :

  1. Installez Z Shell avec cette commande :

    sudo apt-get install zsh
  2. Lorsque vous exécutez zsh pour la première fois, choisissez 0 lorsqu'on vous le demande.

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

    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
    }

    Enregistrez le fichier et fermez-le.

  4. Dans votre terminal, si vous utilisez toujours zsh, lancez source ~/.zshrc ou simplement zsh pour réinitialiser l'invite. Votre invite devrait maintenant ressembler à ceci :

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

    avec quelques couleurs.

  5. Si vous l'aimez, lancez chsh -s /bin/zsh pour changer votre Shell actuel en /bin/zsh (une nouvelle connexion est nécessaire pour que ce changement prenne effet).

  6. Exécuter exit si vous voulez quitter zsh Shell.

Voici un extrait de 15 secondes de mon terminal :

running clock in terminal before the command prompt

38voto

g_p Points 17101

Si vous souhaitez afficher le temps de fonctionnement dans votre terminal, vous pouvez utiliser cette commande. Elle affichera la durée dans la partie supérieure droite 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 &

enter image description here

Mais notez que l'affichage du temps à l'aide de cette commande peut parfois chevaucher le texte présent dans le terminal. Utilisez donc cette commande avec prudence.

Une autre voie peut utiliser le caractère de contrôle dans le PS1

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

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

Mais avec cette méthode, votre temps ne sera actualisé qu'après avoir appuyé sur la touche "Entrée".

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

14voto

Stewart Points 1385

Si vous souhaitez simplement afficher une horloge, il vous suffit d'utiliser date :

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

L'heure s'affichera toutes les secondes jusqu'à ce que vous l'arrêtiez avec CtrlC . Si vous voulez qu'il soit sur la même ligne (ce qui précède imprimera une nouvelle ligne toutes les secondes), faites ceci à la place :

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

3voto

Sojourner Points 31
export PS1='\t$'

Comme je préfère afficher le moins d'informations possible sur le terminal, je personnalise généralement chaque session en tant que # , $ etc. (si vous voulez le changer de façon permanente, la solution de minerz029 est parfaite)

Pour le modifier afin d'afficher le courant, je pourrais opter pour

export PS1='\T$'

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

2voto

Sergiy Kolodyazhnyy Points 97292

Cette question me préoccupe depuis quelques jours, et voici mon post édité avec tous les éléments que j'ai appris. Plus précisément, mon objectif était d'afficher l'horloge à côté de l'invite dans BASH. Comme Radu Radeanu l'a mentionné dans sa réponse, la clé est de trouver une fonction ou une variable capable de rafraîchir constamment l'invite de commande ou de redessiner l'écran, sans interférer avec votre écran ou avec ce que vous tapez. Bien que cela soit possible avec une boucle while, comme l'a montré G_P, le redessin constant de l'écran avec la fonction tput perturbe le texte qui se trouve sur mon écran au moment où il est rafraîchi. Je me suis rapproché de la demande de l'OP en modifiant quelque peu le code que G_P a posté, mais je pense que la réponse de Radu est la plus proche de ce que l'OP veut. Sans plus attendre, voici quelques-unes des choses que j'ai apprises, présentées à votre jugement.

#1, Ma solution préférée : Multiplexeur terminal

Le multiplexeur de terminal est un logiciel qui permet de diviser l'écran du terminal en deux ou plusieurs écrans. En particulier, je voudrais attirer l'attention sur le terminal Byobu. Cet émulateur de terminal basé sur ncurses, vous permet d'afficher le temps, le pourcentage de CPU, la mémoire, et tout un tas d'autres indicateurs. Dans la capture d'écran de mon terminal Byobu, vous pouvez voir la température du CPU, le pourcentage de la batterie, la qualité de la connexion internet, la fréquence du CPU, la RAM, la date, et bien sûr l'heure. Si vous souhaitez surveiller en permanence ces éléments dans le terminal, Byobu est la solution idéale. En fait, je l'apprécie tellement que je l'ai configuré pour qu'il se charge automatiquement lors de la connexion à tty. La seule bizarrerie est que dans tty vous ne pouvez pas fusionner les fenêtres séparées - seulement passer d'un onglet à l'autre avec les touches F3 et F4.

Screenshot of my byobu terminal

Une autre solution impliquant le multiplexage des fenêtres est l'utilisation de splitvt qui divise l'écran en deux parties. Vous pouvez lancer une horloge de terminal telle que tty-clock Pour cela, utilisez la commande watch avec la date, ou codez-en une vous-même avec un script. Nous y reviendrons plus tard. Dans la capture d'écran, vous pouvez voir une partie du split avec l'invite bash normale en haut, et dans la partie inférieure, vous pouvez voir un script en cours d'exécution, qui rafraîchit constamment la sortie de date avec la commande clear commande.

enter image description here

#2 , boucle While Do et tput C'est probablement ce qui se rapproche le plus de ce que la personne qui a posé la question souhaitait voir implémenté avec bash.

G_P a mis en ligne une excellente solution impliquant l'utilisation de la fonction while do y tput commandes. Cependant, dans le code de G_P, il y a deux choses que je n'aime pas. Premièrement, l'horloge était à droite de l'invite, et deuxièmement - parce que le cycle de sommeil est d'une seconde (voir le code original où il est question de sommeil), l'écran est redessiné toutes les secondes, et cela perturbe ma sortie. Ce que j'ai fait, c'est d'éditer mon prompt bash pour qu'il soit une ligne plus bas avec \n et modifier le code de G_P pour que l'opérateur tput positionne l'horloge juste au-dessus de l'invite, et la rafraîchisse toutes les 60 secondes ; cela me permet de voir les heures et les minutes (et je ne me soucie pas vraiment des minutes), tandis que la boucle de l'horloge n'encombre pas mon écran. Tout d'abord, voici mon invite :

PS1='${debian_chroot:+($debian_chroot)}\n[*\u@Ubuntu*]\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 &

Petite modification : J'ai remarqué que le code ci-dessus n'affiche pas toujours l'horloge immédiatement. Voici une meilleure version : while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done & Celui-ci place d'abord l'horloge sur l'écran, puis indique à la base qu'elle doit passer par un cycle de sommeil de 60 secondes.

Notez que le tput cup 0 0 place l'horloge dans le coin supérieur droit de l'écran, juste au-dessus de mon invite et sleep 60 change le cycle de sommeil à 60 secondes, parce que de cette façon je peux surveiller seulement les heures et les minutes au lieu de chaque seconde. De cette façon, le texte que j'ai à l'écran n'est pas affecté, la plupart du temps (seulement quand je lance une commande au moment où l'horloge se rafraîchit).

enter image description here

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 c'est un élément que vous avez ajouté initialement. Et n'oubliez pas de toujours sauvegarder un fichier de ce type au cas où vous feriez un bubu et que vous auriez besoin de revenir en arrière.

#3, Scripting et autres

Cette partie est réservée à ceux qui veulent voir le temps passer. Pour ceux qui veulent le surveiller en permanence, les options #1 et #2 sont préférables.

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

enter image description here

Appuyez sur retour/entrée, et vous verrez la sortie de la commande date s'afficher sur l'écran toutes les secondes. Si vous ne voulez pas taper tout cela à chaque fois, transformez tout cela en script :

#!/bin/bash

while true
do
clear;date
sleep 1
done

Vous pouvez maintenant exécuter ce script avec splitvt dans une instance de bash, tout en travaillant dans l'autre.

Une autre solution consiste à 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 contribuer à cette question. Le terminal Byobu est la meilleure solution, mais décidez vous-même, faites des recherches et choisissez la solution qui vous convient le mieux.

Quelques-unes des choses que j'ai trouvées au cours de mes recherches :

Mon post original, la solution minimaliste : Modifiez votre fichier ~/.bashrc. Je préfère l'éditer avec nano, donc

nano ~/.bashrc

Voici la partie de mon propre fichier édité :

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

Après l'instruction else, la première ligne est commentée avec # (c'est mon ancien prompt), maintenant la deuxième ligne est celle que vous voulez, et spécifiquement \t de l'opérateur. Il indique le temps de fonctionnement au format 24 heures. Pour plus d'informations, consultez este . Autre petite remarque, j'utilise le produit après autre chose, parce que je n'utilise pas de prompteur coloré.

PS : N'hésitez pas à me faire savoir si je dois ajouter quelque chose à ma réponse ou la modifier de quelque manière que ce soit, mais pour l'essentiel, je pense qu'il s'agit de la réponse la plus concluante que j'aie pu trouver, et en tout cas, personnellement, je n'y ajouterai rien de nouveau.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X