web-dev-qa-db-fra.com

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

Je préfère utiliser un terminal et passe la plupart du temps à l'utiliser. Je cherche un moyen de voir le temps dans le terminal pendant que je l’utilise en parallèle. Le temps changerait automatiquement quand il passera. Ce serait génial s'il pouvait s'afficher à gauche de ma commande Invite.

Si ceci est ma commande Invite en terminal:

saurav@saurav-P4I45Gx-PE:~$

Alors j'aimerais voir l'horloge comme:

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

ou

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

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

Alors, y a-t-il un moyen d'y parvenir?

40
Saurav Kumar

Je ne suis pas sûr que ce soit si simple de réaliser cela avec 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 dans l'invite.

Le Z Shell (zsh) possède une commande intégrée, appelée zle, qui, lorsqu'elle est utilisée avec l'argument reset-Prompt, force le déploiement de l'invite, puis réaffiche le tampon d'édition.

Si vous voulez l'essayer, utilisez 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 lorsque vous y êtes invité.

  3. Editez le fichier ~/.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, lorsque vous utilisez encore zsh, exécutez source ~/.zshrc ou simplement zsh pour réinitialiser votre invite. Maintenant, votre invite devrait ressembler à ceci:

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

    avec des couleurs.

  5. Si vous l'aimez, exécutez chsh -s /bin/zsh pour modifier votre Shell actuel en /bin/zsh (une nouvelle connexion est nécessaire pour que cette modification soit prise en compte).

  6. Exécutez exit si vous souhaitez quitter zsh Shell.

Voici un screencast de 15 secondes de mon terminal:

running clock in terminal before the command Prompt

73
Radu Rădeanu

Si vous souhaitez afficher l'heure de fonctionnement 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 &

enter image description here

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

Autre moyen peut utiliser un caractère de contrôle dans la PS1

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

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

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

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

28
g_p

Si tout ce que vous voulez faire, c'est afficher une horloge, utilisez simplement date:

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

Cela montrera le temps chaque seconde jusqu'à ce que vous l'arrêtez 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), procédez comme suit:

while :; do printf '%s\r' "$(date +%r)"; sleep 1 ; done
11
terdon
export PS1='\t$'

étant donné que je préfère afficher le moins d'informations de fond possible sur le terminal, je personnalise généralement chaque session sous la forme #, $, etc. (si vous souhaitez le modifier de manière permanente, la solution de minerz029 est parfaite)

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

export PS1='\T$'

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

2
Sojourner

Cette question me dérange depuis quelques jours, et voici mon post édité avec tout le matériel que j'ai appris. Plus précisément, mon objectif était d’afficher l’horloge à côté de Prompt dans BASH. Comme Radu Radeanu l’a mentionné dans sa réponse, l’essentiel est de trouver une fonction ou une variable capable d’actualiser en permanence l’invite de commande ou de redessiner l’écran, sans interférer avec votre écran ni avec ce que vous tapez. Bien que cela soit possible avec la boucle while, comme le montre G_P, le redessin constant de l’écran avec la fonction tput perturbe le texte affiché à l’écran au moment de son actualisation. Je suis presque sur le point d'atteindre ce que le PO a demandé en modifiant quelque peu le code affiché par G_P, mais je crois toujours que la réponse de Radu est la plus proche de ce que veut PO. Sans plus tarder, voici quelques-unes des choses que j'ai apprises et présentées à votre jugement.

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

Le multiplexeur de terminal est un logiciel qui permet de diviser l'écran du terminal en deux écrans ou plus. En particulier, je veux attirer l'attention sur le terminal Byobu. Cet émulateur de terminal basé sur ncurses vous permet d’afficher le temps, le pourcentage de l’UC, la mémoire et de nombreux autres indicateurs. Dans la capture d'écran de mon terminal byobu, vous pouvez voir la température du processeur, le pourcentage de batterie, la qualité de la connexion Internet, la fréquence du processeur, la mémoire vive, la date et bien sûr l'heure. Si vous êtes principalement préoccupé par la surveillance constante de ces choses au terminal, Byobu est la voie à suivre. En fait, je l’ai tellement aimé que je l’ai configuré pour se charger automatiquement lors de la connexion à tty. Le seul problème est que dans tty, vous ne pouvez pas réellement fusionner les fenêtres séparées - seulement basculer entre les onglets avec les touches F3 et F4.

Screenshot of my byobu terminal

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 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 scission avec l'invite bash normale en haut, et dans la partie inférieure, un script en cours d'exécution qui actualise constamment la sortie de la commande date avec la commande clear.

enter image description here

# 2, While Do Loop et tput Ceci est probablement le plus proche 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. Premièrement, l'horloge était à droite de l'invite, et deux - parce que le cycle de sommeil est d'une seconde (reportez-vous au code d'origine dans lequel il est écrit sommeil), l'écran est redessiné à chaque seconde, ce qui perturbe ma sortie. Ce que j’ai fait, c’est de modifier mon invite bash pour qu’il soit plus bas d’une ligne avec l’opérateur\n et de modifier le code de G_P afin que l’opérateur tput positionne l’horloge juste au-dessus de l’invite et se régénère toutes les 60 secondes; cela me permet de voir les heures et les minutes (et je ne m'inquiète pas vraiment des minutes), alors que la boucle de l'horloge ne gâche pas mon écran. 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 édition : J'ai remarqué que ce code ci-dessus ne fait pas apparaître l'horloge tout de suite parfois. Voici une meilleure version: while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done & Celle-ci place l’horloge à l’écran d’abord, puis indique à Bash de passer par un cycle de sommeil de 60 secondes.

Notez que la tasse tput 0 0 place l’horloge dans le coin supérieur droit de l’écran, juste au-dessus de mon invite et de mon sommeil 60 changements de cycle de veille en 60 secondes, car cela me permet de surveiller uniquement les heures et les minutes au lieu de toutes les secondes. De cette façon, le texte que j'ai à l'écran n'est pas affecté, pour la plupart (uniquement lorsque je lance une commande, la même 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 légèrement. La boucle while do devrait être ajoutée quelque part dans le même fichier, de préférence à la fin avec # commente que c’est ce que vous avez ajouté initialement. Et n'oubliez pas de toujours sauvegarder tous les fichiers de ce type au cas où vous feriez un bubu et que vous deviez revenir à la situation antérieure.

# 3, Scripting and other

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

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

enter image description here

Appuyez sur Entrée/Entrée, et vous verrez essentiellement le résultat de la commande de date affiché sur l'écran effacé toutes les secondes. Si vous ne voulez pas tout écrire à 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 est la commande watch -n1 date, qui exécutera en permanence la commande 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 certaine manière, et je espérons que j'ai pu contribuer à cette question. Le terminal IMHO de Byobu est la meilleure solution, mais décidez-vous par 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 message original, la solution minimaliste: Modifiez votre fichier ~/.bashrc. Je préfère l’éditer avec nano, alors

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 une autre déclaration, la première ligne est commentée avec # (il s’agit de mon ancien message), la deuxième ligne est celle que vous souhaitez, et plus précisément l'opérateur \t. Cela montre la durée en format 24 heures. Pour plus d'informations, consultez this . Aussi une petite note, j'utilise les trucs après, parce que je n'utilise pas Prompt de couleur.

PS: Merci de me faire savoir si je devrais ajouter quelque chose à ma réponse ou la modifier de quelque manière que ce soit, mais pour la plupart, j'estime que c'est très concluant. répondez que je pourrais proposer, et au moins personnellement, je n’ajouterai rien de nouveau à cela.

2
Sergiy Kolodyazhnyy

Cette heure ne changera que lorsqu'une nouvelle invite sera exécutée

Vous pouvez ajouter ce qui suit à votre .bashrc:

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

Ce qui produira:

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

Plus d'informations ici: http://www.thegeekstuff.com/2008/09/bash-Shell-ps1-10-examples-to-make-your-linux-Prompt-like-angelina-jolie/#8

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

1
kiri

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&
}
1
Alex Sweetheart

J'aime beaucoup la fonction d'horloge ncmpcpp , déclenchée par clé (voir capture d'écran). Pour plus de détails sur la procédure d'installation, veuillez vous référer à ceci post .

enter image description here

1
v2r