Cómo mostrar un reloj en ejecución en la terminal antes del símbolo del sistema

40

Prefiero usar el terminal y pasar la mayor parte del tiempo usándolo. Estoy buscando una forma de ver el tiempo en la terminal mientras lo uso en paralelo. El tiempo cambiará automáticamente cuando pase. Sería increíble si se mostrara a la izquierda en mi símbolo del sistema.

Si este es mi símbolo del sistema en la terminal:

saurav@saurav-P4I45Gx-PE:~$

Entonces me gustaría ver el reloj (hora) como:

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

o

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

o cualquier otro formato. donde 06:27:01esta el tiempo Lo que quiero es mostrar el tiempo que cambia cuando pasan los segundos.

Entonces, ¿hay alguna manera de lograr esto?

Saurav Kumar
fuente
Es posible que pueda configurar la $PS1variable (solicitud) para que tenga tiempo, pero no estoy seguro de si los cambios.
kiri
Puede especificar \@, pero la hora solo se volverá a calcular cada vez que se muestre el mensaje, no la hora actual.
kiri
2
@muru, como especifiqué en mi pregunta, esa respuesta solo funciona para zsh, no para bash.
Rosh_Th
2
Pero la pregunta en sí no se trata de zsh (es general), por lo que le aconsejé a G_P que publique la respuesta allí. Con la respuesta de G_P ahora agregada allí, califica como un engañado.
muru
1
@muru esa otra pregunta específicamente quiere el tiempo en el aviso. El OP aquí solo quiere que se imprima en el terminal y no especifica que tenga que estar en la solicitud.
terdon

Respuestas:

74

No estoy seguro de que sea tan simple lograr esto usando el shell bash predeterminado (pero no digo que sea imposible). Probablemente necesitará un comando / función que pueda actualizar el símbolo del sistema cada segundo sin interferir con nada de lo que escriba en el indicador.

El shell Z (zsh) tiene un comando incorporado, llamado zle, que, cuando se usa con el reset-promptargumento, obliga a que la solicitud se vuelva a expandir y luego vuelve a mostrar el búfer de edición.

Si quieres probarlo, sigue los siguientes pasos:

  1. Instale Z shell con este comando:

    sudo apt-get install zsh
    
  2. Cuando corras zshpor primera vez, elige 0cuándo se te pedirá.

  3. Edite el ~/.zshrcarchivo y agregue las siguientes líneas:

    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
    }
    

    Guarde el archivo y ciérrelo.

  4. En su terminal, cuando todavía está usando zsh, ejecute source ~/.zshrc, o simplemente zsh, para restablecer su solicitud. Ahora su aviso debería verse así:

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

    con algunos colores

  5. Si lo desea, ejecute chsh -s /bin/zshpara cambiar su shell actual a /bin/zsh(es necesario volver a iniciar sesión para que este cambio surta efecto).

  6. Ejecútelo exitsi desea salir del shell zsh.

Aquí hay un screencast de 15 segundos desde mi terminal:

reloj en ejecución en la terminal antes del símbolo del sistema

Radu Rădeanu
fuente
44
Puntos de bonificación por screencast. Cosas geniales de hecho.
MadMike
@SauravKumar Ejecutar chshpara cambiar su shell predeterminado de /bin/basha /bin/zsh. Debe cerrar sesión e iniciar sesión nuevamente.
Radu Rădeanu
En realidad lo hice ... Pero cada vez que se abre la terminal tengo que ejecutar un zshcomando para entrar en este modo de reloj ...
Saurav Kumar
@ RaduRădeanu: Sí funcionó después de iniciar sesión y reiniciar ... Eres genial ... ¡Jai Ho! : P
Saurav Kumar
Esto no funciona para mi. Después de un segundo, cierra la terminal. Estoy en Linux Mint, pero no pensé que eso importara, ya que todavía uso zsh. ¿Algunas ideas?
istrasci
28

Si desea mostrar el tiempo de ejecución en su terminal, puede usar este comando. Mostrará la hora en la parte superior derecha de su terminal.

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

ingrese la descripción de la imagen aquí

Pero tenga en cuenta que mostrar el tiempo usando este comando en algún momento puede superponerse al texto presente en la terminal. Entonces use este comando con poca precaución.

Otra forma puede ser usar el carácter de control en la PS1

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

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

Pero en este método, su tiempo se actualizará solo después de presionar enter.

Si desea el método anterior permanente, agregue el comando anterior (el que le guste o ambos) en su ~.bashrcarchivo.

g_p
fuente
¡Excelente! ¿Alguna pista sobre cómo cambiar el color del reloj?
Calculus Knight
1
@CalculusKnight, puede cambiar el código de color en el comando. Puede consultar esto para el código de color. misc.flogisoft.com/bash/tip_colors_and_formatting
g_p
1
Esto funciona PERFECTAMENTE, muchas gracias. Lo llamo desde .bashrc para evitar que un firewall excesivamente proactivo elimine las conexiones SSH inactivas.
Criggie
11

Si todo lo que quieres hacer es mostrar un reloj, solo usa date:

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

Eso mostrará el tiempo cada segundo hasta que lo detengas CtrlC. Si desea que esté en la misma línea (lo anterior imprimirá una nueva línea cada segundo), haga esto en su lugar:

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

Esta pregunta me ha estado molestando durante unos días, y aquí está mi publicación editada con todo el material que he aprendido. Específicamente, mi objetivo era lograr mostrar el reloj junto al indicador en BASH. Al igual que Radu Radeanu mencionó en su respuesta, la clave es encontrar una función o variable que pueda actualizar constantemente el símbolo del sistema o volver a dibujar la pantalla, sin interferir con su pantalla o con lo que escriba. Si bien esto es posible con el ciclo while, como lo muestra G_P, el rediseño constante de la pantalla con la función tput se confunde con el texto que esté en mi pantalla en el instante en que se actualiza. Me he acercado bastante a lograr lo que el OP solicitó modificando un poco el código que G_P publicó, pero aún creo que la respuesta de Radu es la más cercana a lo que OP quiere. Sin más preámbulos, he aquí algunas de las cosas que '

# 1, mi solución preferida: multiplexor terminal

Terminal multiplexer es un software que permite dividir la pantalla del terminal en dos o más pantallas. En particular, quiero llamar la atención sobre el terminal Byobu. Este emulador de terminal basado en ncurses le permite mostrar el tiempo, el porcentaje de CPU, la memoria y muchos otros indicadores. En la captura de pantalla de mi terminal byobu, puede ver la temperatura de la CPU, el porcentaje de batería, la calidad de la conexión a Internet, la frecuencia de la CPU, la RAM, la fecha y, por supuesto, el tiempo. Si te preocupa principalmente monitorear constantemente estas cosas mientras estás en la terminal, Byobu es el camino a seguir. De hecho, me ha gustado tanto que lo configuré para que se cargue automáticamente al iniciar sesión en tty. La única peculiaridad es que en tty no puedes fusionar las ventanas separadas, solo cambia entre pestañas con las teclas F3 y F4.

Captura de pantalla de mi terminal byobu

Una solución alternativa que involucra ventanas de multiplexación es mediante el uso splitvt, que divide la pantalla en dos partes. Puede ejecutar un reloj de terminal como tty-clock, usar el comando watch con fecha, o puede codificar uno usted mismo con un script. Más sobre eso más tarde. En la captura de pantalla, puede ver una parte de la división con el indicador bash normal en la parte superior, y en la parte inferior puede ver un script en ejecución, que simplemente actualiza constantemente la salida del datecomando con el clearcomando.

ingrese la descripción de la imagen aquí

# 2, While Do Loop y tput Esto es probablemente lo más cercano a lo que la persona que hizo la pregunta quería implementar con bash.

G_P ha publicado una gran solución que involucra los comandos while doy tput. Sin embargo, en el código de G_P había dos cosas que no me gustaban. Uno, el reloj estaba a la derecha del indicador, y dos, porque el ciclo de suspensión es de 1 segundo (consulte el código original donde dice suspensión), la pantalla se redibuja cada segundo, y eso daña mi salida. Lo que hice fue editar mi indicador bash para que esté una línea más abajo con \ n operador y cambiar el código de G_P para que el operador tput coloque el reloj justo encima del indicador y se actualice cada 60 segundos; eso me permite ver horas y minutos (y no me importan exactamente los minutos), mientras que el bucle del reloj no estropea mi pantalla. Primero, aquí está mi mensaje:

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

Y aquí está el código modificado de G_P: enter code here

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

Edición pequeña : he notado que este código anterior no muestra el reloj de inmediato a veces. Aquí hay una versión mejor: while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done & esta coloca el reloj en la pantalla primero, luego le avisa a bash para que pase por el ciclo de sueño de 60 segundos

Tenga en cuenta que el tput cup 0 0 coloca el reloj en la esquina superior derecha de la pantalla, justo encima de mi indicador y sleep 60 cambia el ciclo de sueño a 60 segundos, porque de esa manera puedo monitorear solo horas y minutos en lugar de cada segundo. De esta manera, el texto que tengo en la pantalla no se ve afectado, en su mayor parte (solo cuando ejecuto un comando al mismo tiempo que se actualiza el reloj).

ingrese la descripción de la imagen aquí

La línea PS1 ya está en su perfil .bashrc, por lo que solo necesita modificarla un poco. El bucle while do debe agregarse en algún lugar del mismo archivo, preferiblemente al final con # comentario de que esto es algo que agregó inicialmente. Y no olvides siempre hacer una copia de seguridad de cualquier archivo así en caso de que hagas bubu y necesites volver a ser como antes.

# 3, secuencias de comandos y otros

Esta parte es simplemente para aquellos que quieren ver el tiempo. Para aquellos que desean monitorearlo constantemente, las opciones preferidas son la n.º 1 y la n.º 2.

Entonces, como ya hemos visto, el bucle while do es bastante útil. Así es como puede crear un reloj con los comandos while do loop, date y sleep.

ingrese la descripción de la imagen aquí

Presione regresar / ingresar, y básicamente verá la salida del comando de fecha que se muestra en la pantalla borrada cada segundo. Si no quieres escribir todo eso cada vez, convierte todo esto en script:

#!/bin/bash

while true
do
clear;date
sleep 1
done

Ahora puede ejecutar ese script con splitvt en una instancia de bash, mientras trabaja en la otra.

Otra solución es el watch -n1 datecomando, que ejecutará continuamente el comando de fecha con un período de 1 segundo.

En conclusión: he aprendido algunas cosas al tratar de encontrar la respuesta a esta pregunta, y espero que mis hallazgos lo hayan ayudado de alguna manera, y espero haber podido contribuir en esta pregunta. Byobu terminal IMHO es la mejor solución, pero decide por ti mismo, investiga un poco y elige la forma que mejor funcione para ti.

Algunas de las cosas que he encontrado al investigar:

Mi publicación original, la solución minimalista: edite su archivo ~ / .bashrc. Prefiero editarlo con nano, así que

nano ~/.bashrc

Aquí está la parte de mi propio archivo editado:

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

Después de la instrucción else, la primera línea se comenta con # (este es mi antiguo indicador), ahora la segunda línea es la que desea, y específicamente el \toperador. Eso muestra el tiempo de ejecución en formato de 24 horas. Para más información mira esto . También una pequeña nota, estoy usando las cosas después de otra cosa, porque no estoy usando un indicador de color.

PD: Por favor, avíseme si debo agregar algo a mi respuesta o editarlo de alguna manera, pero en su mayor parte creo que esta es la respuesta más concluyente que se me ocurre, y al menos personalmente no agregaré nada. nuevo en esto.

Sergiy Kolodyazhnyy
fuente
1
Esto no mostrará un reloj 'en ejecución' como lo desea el OP. Simplemente agregará el tiempo al indicador de terminal.
Parto
2
export PS1='\t$'

ya que prefiero mostrar tan poco información de fondo como sea posible en el terminal i generalmente personalizar cada sesión como #, $, etc. (si desea cambiar de forma permanente, la solución de minerz029 es perfecto)

Para modificarlo para mostrar actual, podría ir para

export PS1='\T$'

por tiempo en formato de 12 horas. Puede ver la documentación de bash para otras opciones.

Sojourner
fuente
1

Esta vez solo cambiará cuando se ejecute una nueva solicitud

Puede agregar lo siguiente a su .bashrc:

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

Lo que producirá:

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

Más información aquí: http://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/#8

Busque "8. Cree su propio mensaje utilizando los códigos disponibles para la variable PS1" en la página anterior.

kiri
fuente
2
Le agradezco su tiempo y esfuerzo, pero esto no es lo que quiero ...
Saurav Kumar
@SauravKumar Sí, entiendo que quieres un reloj en funcionamiento . No estoy seguro de si eso es posible con la variable 'PS1', tal vez $PROMPT_COMMANDfuncionaría si puedes encontrar un comando que muestre el tiempo de tic-tac.
kiri
Bueno, creo que puedes hacer esto ... :) Parece que has llegado cerca de la solución ...
Saurav Kumar
¿Por qué incluye \ u dos veces? @SauravKumar
David
@David: Lo siento, no lo sé. Pero @ minerz029 probablemente respondería tu pregunta. :)
Saurav Kumar
1

Realmente me gusta la función de reloj ncmpcpp , activada por 0-key (ver captura de pantalla). Para obtener más detalles sobre el procedimiento de instalación, consulte esta publicación .

ingrese la descripción de la imagen aquí

v2r
fuente
1
watch -t -n1 "date +%T|figlet" Sería una manera fácil.
g_p
1

Influenciado por g_p y Serg , intenté crear una función en bash. Funciona, pero no estoy seguro de que sea una buena idea verificar el comando ps cada segundo para ver si bash es un proceso 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&
}
Alex cariño
fuente
0

Si nunca necesita usarlo, debian_chrootentonces es un lugar útil para poner la hora en que se mostró el símbolo del sistema usando:

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

Escriba esto en su terminal y observe cómo cambia el símbolo del sistema con la hora:

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

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

Una vez que se establece el tiempo una vez, para obtener un reloj en funcionamiento que se actualiza cada segundo uso:

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

Esto .gifmuestra los comandos en acción:

Terminal de tiempo prompt.gif

WinEunuuchs2Unix
fuente