So zeigen Sie eine laufende Uhr im Terminal vor der Eingabeaufforderung an

40

Ich bevorzuge Terminal und verbringe die meiste Zeit damit. Ich suche nach einer Möglichkeit, die Zeit im Terminal zu sehen, während ich sie parallel verwende. Die Zeit würde sich automatisch ändern, wenn sie vergeht. Es wäre fantastisch, wenn es links von meiner Eingabeaufforderung angezeigt würde.

Wenn dies meine Eingabeaufforderung im Terminal ist:

saurav@saurav-P4I45Gx-PE:~$

Dann möchte ich Uhr (Zeit) sehen als:

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

oder

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

oder irgendein anderes Format. wo 06:27:01ist die zeit Ich möchte nur die Zeit anzeigen, die sich ändert, wenn Sekunden vergehen.

Gibt es also eine Möglichkeit, dies zu erreichen?

Saurav Kumar
quelle
Möglicherweise können Sie die $PS1Variable (Eingabeaufforderung) so einstellen , dass sie die Uhrzeit anzeigt, aber ich bin mir nicht sicher, ob Änderungen vorgenommen wurden.
kiri
Sie können angeben \@, aber die Uhrzeit wird nur jedes Mal neu berechnet, wenn die Eingabeaufforderung angezeigt wird, und nicht die aktuelle Uhrzeit.
Kiri
2
@muru, Wie ich in meiner Frage angegeben habe, funktioniert diese Antwort nur für zsh, nicht für bash.
Rosh_Th
2
Da es sich bei der Frage selbst nicht um zsh handelt (es ist allgemein), empfahl ich G_P, die Antwort dort zu posten. Wenn die Antwort von G_P jetzt dort hinzugefügt wird, wird sie als Betrug gewertet.
muru
1
@muru, die andere Frage möchte speziell die Zeit in der Eingabeaufforderung. Das OP hier möchte nur, dass es im Terminal gedruckt wird, und gibt nicht an, dass es in der Eingabeaufforderung sein muss.
terdon

Antworten:

74

Ich bin mir nicht sicher, ob es so einfach ist, dies mit der Standard-Bash-Shell zu erreichen (aber ich sage nicht, dass es unmöglich ist). Möglicherweise benötigen Sie einen Befehl / eine Funktion, mit der die Eingabeaufforderung jede Sekunde aktualisiert werden kann, ohne dass Sie Eingaben in die Eingabeaufforderung stören.

Die Z-Shell (zsh) verfügt über einen integrierten Befehl namens zle, der bei Verwendung mit dem reset-promptArgument die erneute Erweiterung der Eingabeaufforderung erzwingt und dann den Bearbeitungspuffer erneut anzeigt.

Wenn Sie es versuchen möchten, gehen Sie folgendermaßen vor:

  1. Installieren Sie die Z-Shell mit diesem Befehl:

    sudo apt-get install zsh
    
  2. Wenn Sie zshzum ersten Mal ausgeführt werden, wählen 0Sie , wann Sie gefragt werden.

  3. Bearbeiten Sie die ~/.zshrcDatei und fügen Sie die folgenden Zeilen hinzu:

    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
    }
    

    Speichern Sie die Datei und schließen Sie sie.

  4. Führen Sie in Ihrem Terminal, wenn Sie noch zsh verwenden source ~/.zshrc, oder setzen Sie einfach zshIhre Eingabeaufforderung zurück. Jetzt sollte Ihre Eingabeaufforderung so aussehen:

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

    mit einigen farben.

  5. Wenn es Ihnen gefällt, führen Sie aus chsh -s /bin/zsh, um Ihre aktuelle Shell in zu ändern /bin/zsh(eine erneute Anmeldung ist erforderlich, damit diese Änderung wirksam wird).

  6. Führen exitSie diese Option aus, wenn Sie die zsh-Shell beenden möchten.

Hier ist ein 15-Sekunden-Screencast von meinem Terminal:

Uhr im Terminal vor der Eingabeaufforderung ausführen

Radu Rădeanu
quelle
4
Bonuspunkte für Screencast. Tatsächlich cooles Zeug.
MadMike
@SauravKumar Führen chshSie diesen Befehl aus , um Ihre Standard-Shell von /bin/bashauf zu ändern /bin/zsh. Sie müssen sich abmelden und erneut anmelden.
Radu Rădeanu
Eigentlich habe ich es geschafft. Aber jedes Mal, wenn das Terminal geöffnet wird, muss ich den zshBefehl ausführen , um in diesen
Uhrmodus
@ RaduRădeanu: Ja funktionierte nach dem Login sowie Neustart .. Du bist großartig .. Jai Ho !! : P
Saurav Kumar
Das funktioniert bei mir nicht. Nach einer Sekunde wird das Terminal geschlossen. Ich bin in Linux Mint, aber ich dachte nicht, dass das etwas ausmachen würde, da ich immer noch zsh benutze. Irgendwelche Ideen?
Istrasci
28

Wenn Sie die Laufzeit in Ihrem Terminal anzeigen möchten, können Sie diesen Befehl verwenden. Die Uhrzeit wird oben rechts in Ihrem Terminal angezeigt.

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

Bildbeschreibung hier eingeben

Beachten Sie jedoch, dass die Anzeige der Uhrzeit mit diesem Befehl manchmal den im Terminal vorhandenen Text überlappen kann. Verwenden Sie diesen Befehl daher mit wenig Vorsicht.

Eine andere Möglichkeit ist die Verwendung von Steuerzeichen in der PS1

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

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

Bei dieser Methode wird Ihre Zeit jedoch erst aktualisiert, nachdem Sie die Eingabetaste gedrückt haben.

Wenn Sie die obige Methode dauerhaft verwenden möchten, fügen Sie den obigen Befehl (den gewünschten oder beide) in Ihre ~.bashrcDatei ein.

g_p
quelle
Toll! Gibt es Hinweise, wie man die Farbe der Uhr ändert?
Calculus Knight
1
@CalculusKnight, Sie können den Farbcode im Befehl ändern. Sie können dies für den Farbcode beziehen. misc.flogisoft.com/bash/tip_colors_and_formatting
g_p
1
Das funktioniert perfekt - vielen Dank. Ich rufe es von .bashrc auf, um zu verhindern, dass eine zu proaktive Firewall inaktive SSH-Verbindungen beendet.
Criggie
11

Wenn Sie nur eine Uhr anzeigen möchten, verwenden Sie einfach date:

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

Das wird jede Sekunde die Zeit anzeigen, bis Sie damit aufhören CtrlC. Wenn Sie möchten, dass es sich in derselben Zeile befindet (die obige Zeile gibt jede Sekunde eine neue Zeile aus), gehen Sie stattdessen folgendermaßen vor:

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

Diese Frage beschäftigt mich seit einigen Tagen und hier ist mein bearbeiteter Beitrag mit all dem Material, das ich gelernt habe. Insbesondere war es mein Ziel, das Anzeigen der Uhrzeit neben der Eingabeaufforderung in BASH zu erreichen. Genau wie bei Radu Radeanu, der in seiner Antwort erwähnt wurde, müssen Sie eine Funktion oder Variable finden, mit der Sie die Eingabeaufforderung ständig aktualisieren oder den Bildschirm neu zeichnen können, ohne Ihren Bildschirm oder Ihre Eingabe zu beeinträchtigen. Während dies mit einer while-Schleife möglich ist, wie durch G_P gezeigt, verschlechtert das ständige Neuzeichnen des Bildschirms mit der tput-Funktion den Text, der sich zum Zeitpunkt der Aktualisierung auf meinem Bildschirm befindet. Ich bin dem, was das OP verlangte, ziemlich nahe gekommen, indem ich den Code, den G_P gepostet hat, etwas modifiziert habe, aber ich glaube immer noch, dass Radus Antwort dem am nächsten kommt, was das OP will. Ohne weiteres, hier sind einige der Dinge, die ich

# 1, Meine bevorzugte Lösung: Terminal Multiplexer

Terminal-Multiplexer ist eine Software, mit der der Terminal-Bildschirm in zwei oder mehr Bildschirme aufgeteilt werden kann. Insbesondere möchte ich auf das Byobu-Terminal aufmerksam machen. Mit diesem ncurses-basierten Terminalemulator können Sie Zeit, CPU-Prozentsatz, Arbeitsspeicher und eine ganze Reihe anderer Indikatoren anzeigen. Auf dem Screenshot meines Byobu-Terminals sehen Sie die CPU-Temperatur, den Akku-Prozentsatz, die Qualität der Internetverbindung, die CPU-Frequenz, den Arbeitsspeicher, das Datum und natürlich die Uhrzeit. Wenn Sie sich hauptsächlich mit der ständigen Überwachung dieser Dinge beschäftigen, während Sie im Terminal sind, ist Byobu der richtige Weg. Tatsächlich hat es mir so gut gefallen, dass ich es so eingestellt habe, dass es automatisch geladen wird, wenn ich mich bei tty anmelde. Der einzige Nachteil ist, dass Sie die einzelnen Fenster nicht zusammenführen können. Wechseln Sie nur mit den Tasten F3 und F4 zwischen den Registerkarten.

Screenshot meines Byobu-Terminals

Eine alternative Lösung für das Multiplexen von Fenstern ist die Verwendung von splitvt, die den Bildschirm in zwei Teile aufteilt. Sie können eine Terminaluhr ausführen, z. B. den tty-clockBefehl watch with date, oder Sie können selbst eine mit einem Skript codieren. Dazu später mehr. Im Screenshot sehen Sie einen Teil der Aufteilung mit der normalen Bash-Eingabeaufforderung oben und im unteren Teil sehen Sie ein Skript, das die Ausgabe von dateBefehlen mit Befehlen ständig aktualisiert clear.

Bildbeschreibung hier eingeben

# 2, While Do Loop und tput Dies ist wahrscheinlich der Schlussel zu dem, was die Person, die die Frage gestellt hat, mit bash implementiert haben wollte.

G_P hat eine großartige Lösung für die Befehle while dound veröffentlicht tput. In G_Ps Code gab es jedoch zwei Dinge, die mir nicht gefielen. Erstens war die Uhr rechts von der Eingabeaufforderung und zweitens - da der Ruhezustand 1 Sekunde beträgt (siehe Originalcode, in dem Sleep angegeben ist), wird der Bildschirm jede Sekunde neu gezeichnet, was meine Ausgabe durcheinander bringt. Was ich getan habe, ist, meine Bash-Eingabeaufforderung so zu bearbeiten, dass sie mit dem Operator \ n eine Zeile tiefer liegt, und den Code von G_P so zu ändern, dass der Operator tput die Uhr direkt über der Eingabeaufforderung positioniert und alle 60 Sekunden aktualisiert. Auf diese Weise kann ich Stunden und Minuten sehen (und Minuten sind mir eigentlich egal), während die Schleife der Uhr meinen Bildschirm nicht durcheinander bringt. Hier ist meine Eingabeaufforderung:

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

Und hier ist der geänderte Code von G_P: enter code here

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

Kleine Änderung : Mir ist aufgefallen, dass der obige Code die Uhr manchmal nicht sofort aufruft. Hier ist eine bessere Version: while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done & Hier wird die Uhr zuerst auf dem Bildschirm angezeigt und dann der 60-Sekunden-Schlafzyklus angezeigt

Beachten Sie, dass der Wert tput cup 0 0 die Uhr in der oberen rechten Ecke des Bildschirms direkt über meiner Eingabeaufforderung platziert und sleep 60 den Schlafzyklus auf 60 Sekunden ändert, da ich auf diese Weise nur Stunden und Minuten statt jeder Sekunde überwachen kann. Auf diese Weise wird der Text, den ich auf dem Bildschirm habe, größtenteils nicht beeinflusst (nur wenn ich zufällig einen Befehl ausführe, wird die Uhrzeit aktualisiert).

Bildbeschreibung hier eingeben

Die PS1-Zeile befindet sich bereits in Ihrem .bashrc-Profil, daher müssen Sie sie nur ein wenig anpassen. Die while-do-Schleife sollte an einer beliebigen Stelle in derselben Datei eingefügt werden, vorzugsweise am Ende mit dem Kommentar #, dass dies das ist, was Sie anfangs hinzugefügt haben. Und vergessen Sie nicht, immer eine solche Datei zu sichern, nur für den Fall, dass Sie bubu machen und zu dem Zustand zurückkehren müssen, wie er war.

# 3, Scripting und andere

Dieser Teil ist nur für diejenigen, die Zeit sehen wollen. Für diejenigen, die es ständig überwachen möchten, sind # 1 und # 2 bevorzugte Optionen.

Wie wir bereits gesehen haben, ist die while-do-Schleife ziemlich nützlich. Mit den Befehlen while do loop, date und sleep können Sie eine Uhr erstellen.

Bildbeschreibung hier eingeben

Wenn Sie die Eingabetaste drücken, wird die Ausgabe des Datums-Befehls im Sekundentakt auf dem gelöschten Bildschirm angezeigt. Wenn Sie das nicht jedes Mal eingeben möchten, wandeln Sie all diese Dinge in ein Skript um:

#!/bin/bash

while true
do
clear;date
sleep 1
done

Jetzt können Sie dieses Skript mit splitvt in einer Instanz von bash ausführen, während Sie in der anderen arbeiten.

Eine andere Lösung ist der watch -n1 dateBefehl, der kontinuierlich einen Datumsbefehl mit einer Dauer von 1 Sekunde ausführt.

Fazit: Ich habe einige Dinge gelernt, als ich versucht habe, eine Antwort auf diese Frage zu finden, und ich hoffe, meine Erkenntnisse haben Ihnen in gewisser Weise geholfen, und ich hoffe, ich konnte zu dieser Frage einen Beitrag leisten. Das Byobu-Terminal IMHO ist die beste Lösung, aber entscheiden Sie selbst, recherchieren Sie und wählen Sie den für Sie am besten geeigneten Weg.

Einige der Dinge, die ich bei meinen Recherchen gefunden habe:

Mein ursprünglicher Beitrag, die minimalistische Lösung: Bearbeiten Sie Ihre ~ / .bashrc-Datei. Ich bearbeite es also lieber mit Nano

nano ~/.bashrc

Hier ist der Teil meiner eigenen bearbeiteten Datei:

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

Nach else wird die erste Zeile mit # auskommentiert (das ist meine alte Eingabeaufforderung), jetzt ist die zweite Zeile die gewünschte und speziell der \tOperator. Das zeigt die Laufzeit im 24-Stunden-Format. Für weitere Informationen überprüfen diese . Auch eine kleine Anmerkung, ich benutze das Zeug nach dem anderen, weil ich keine farbige Eingabeaufforderung benutze.

PS: Bitte lassen Sie mich wissen, ob ich etwas zu meiner Antwort hinzufügen oder auf irgendeine Weise bearbeiten sollte, aber ich glaube, dass dies größtenteils die schlüssigste Antwort ist, die ich finden konnte, und zumindest werde ich persönlich nichts hinzufügen neu dabei.

Sergiy Kolodyazhnyy
quelle
1
Dies zeigt keine "laufende" Uhr an, wie es das OP wünscht. Es wird nur die Zeit zur Eingabeaufforderung des Terminals hinzugefügt.
Parto
2
export PS1='\t$'

da ich im Allgemeinen in jeder Session als anpassen auf dem Terminal - i so wenig Hintergrundinformationen wie möglich Anzeige bevorzugen #, $usw. (wenn Sie es ändern permanent wollen, minerz029 Lösung ist perfekt)

Um es so zu modifizieren, dass es aktuell ist, könnte ich gehen

export PS1='\T$'

für die Zeit im 12-Stunden-Format. Sie können die Bash-Dokumentation für andere Optionen anzeigen.

Sojourner
quelle
1

Diese Zeit ändert sich nur, wenn eine neue Eingabeaufforderung ausgeführt wird

Sie können Folgendes hinzufügen .bashrc:

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

Welches wird produzieren:

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

Weitere Informationen finden Sie hier: http://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/#8

Suchen Sie auf der obigen Seite nach "8. Erstellen Sie Ihre eigene Eingabeaufforderung mit den verfügbaren Codes für die PS1-Variable".

kiri
quelle
2
Ich bedanke mich für Ihre Zeit und Mühe, aber das ist nicht das, was ich will ..
Saurav Kumar
@ SauravKumar Ja, ich verstehe, Sie wollen eine laufende Uhr. Ich bin mir nicht sicher, ob das mit der 'PS1'-Variablen möglich ist. Vielleicht $PROMPT_COMMANDwürde es funktionieren, wenn Sie einen Befehl finden, der die Tick-Zeit anzeigt.
kiri
Nun, ich denke, Sie können dies tun .. :) Es scheint, dass Sie in der Nähe der Lösung erreicht haben ..
Saurav Kumar
warum es enthält \ u zweimal? @ SauravKumar
David
@ David: Es tut mir leid, ich weiß es nicht. Aber @ minerz029 würde wahrscheinlich Ihre Frage beantworten. :)
Saurav Kumar
1

Ich mag die Funktion ncmpcpp clock, die mit 0-key ausgelöst wird (siehe Screenshot). Weitere Informationen zum Installationsvorgang finden Sie in diesem Beitrag .

Bildbeschreibung hier eingeben

v2r
quelle
1
watch -t -n1 "date +%T|figlet" wäre ein einfacher weg.
g_p
1

Beeinflusst von g_p und Serg habe ich versucht, in bash eine Funktion zu erstellen. Es funktioniert, aber ich bin nicht sicher, ob es eine gute Idee ist, den Befehl ps jede Sekunde zu überprüfen, um festzustellen, ob bash ein fg-Prozess ist oder nicht

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 Sweetheart
quelle
0

Wenn Sie diese Option nie benötigen, können debian_chrootSie die Uhrzeit, zu der die Eingabeaufforderung angezeigt wurde, folgendermaßen eingeben:

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

Geben Sie dies in Ihr Terminal ein und beobachten Sie, wie sich Ihre Eingabeaufforderung mit der Zeit ändert:

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

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

Nachdem die Zeit einmal eingestellt wurde, um eine laufende Uhr zu erhalten, die jede Sekunde aktualisiert, verwenden Sie:

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

Dies .gifzeigt die Befehle in Aktion:

Zeitterminal prompt.gif

WinEunuuchs2Unix
quelle