Jak wyświetlić bieżący zegar w terminalu przed wierszem poleceń

40

Wolę używać terminala i spędzam większość czasu z niego. Szukam sposobu, aby zobaczyć czas w terminalu, gdy używam go równolegle. Czas zmienia się automatycznie, gdy mija. Byłoby super, gdyby wyświetlał się w wierszu polecenia.

Jeśli to jest mój wiersz poleceń w terminalu:

saurav@saurav-P4I45Gx-PE:~$

Następnie chciałbym zobaczyć zegar (czas) jako:

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

lub

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

lub w dowolnym innym formacie. gdzie 06:27:01jest czas Chcę tylko pokazać czas, który zmienia się wraz z upływem sekund.

Czy jest więc jakiś sposób na osiągnięcie tego?

Saurav Kumar
źródło
Możliwe, że możesz ustawić $PS1zmienną (monit), aby mieć czas, ale nie jestem pewien, czy zmiany.
kiri
Możesz określić \@, ale czas będzie ponownie obliczany tylko za każdym razem, gdy wyświetla się monit, a nie bieżący czas.
kiri
2
@muru, jak określiłem w moim pytaniu, ta odpowiedź działa tylko dla zsh, a nie dla bash.
Rosh_Th
2
Ale samo pytanie nie dotyczy zsh (jest ogólne), więc doradziłem G_P, aby opublikował tam odpowiedź. Po dodaniu tam odpowiedzi G_P kwalifikuje się ona jako duplikat.
muru
1
@muru, że inne pytanie konkretnie chce czasu w pytaniu. OP tutaj chce po prostu wydrukować go w terminalu i nie określa, że ​​musi to być monit.
terdon

Odpowiedzi:

74

Nie jestem pewien, czy osiągnięcie tego jest tak proste przy użyciu domyślnej powłoki bash (ale nie twierdzę, że jest to niemożliwe). Prawdopodobnie będziesz potrzebować polecenia / funkcji, która może odświeżać wiersz polecenia co sekundę bez ingerowania w cokolwiek, co wpiszesz w wierszu polecenia.

Powłoki Z (zsh) ma wbudowany polecenia, zwany zle, który, stosowany ze reset-promptargumentu siły zachęty do ponownego spienionych, a następnie ponownie wyświetla bufor edycji.

Jeśli chcesz spróbować, wykonaj następujące czynności:

  1. Zainstaluj powłokę Z za pomocą tego polecenia:

    sudo apt-get install zsh
    
  2. Podczas zshpierwszego uruchomienia wybierz, 0kiedy zostaniesz o to poproszony.

  3. Edytuj ~/.zshrcplik i dodaj następujące wiersze:

    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
    }
    

    Zapisz plik i zamknij go.

  4. W swoim terminalu, gdy nadal używasz zsh, uruchom source ~/.zshrclub po prostu zsh, aby zresetować monit. Teraz twój monit powinien wyglądać następująco:

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

    z niektórymi kolorami.

  5. Jeśli ci się podoba, uruchom, chsh -s /bin/zshaby zmienić bieżącą powłokę na /bin/zsh(wymagane jest ponowne zalogowanie, aby zmiana mogła zostać zastosowana).

  6. Uruchom, exitjeśli chcesz wyjść z powłoki zsh.

Oto 15 sekundowy zrzut ekranu z mojego terminala:

uruchamianie zegara w terminalu przed wierszem poleceń

Radu Rădeanu
źródło
4
Punkty bonusowe za screencast. Rzeczywiście fajne rzeczy.
MadMike,
@SauravKumar Uruchom, chshaby zmienić domyślną powłokę z /bin/bashna /bin/zsh. Musisz się wylogować i zalogować ponownie.
Radu Rădeanu
Właściwie to zrobiłem ... Ale za każdym razem, gdy otwiera się terminal, muszę wykonać zshpolecenie, aby wejść w ten tryb zegara.
Saurav Kumar,
@ RaduRădeanu: Tak działało po zalogowaniu, a także po ponownym uruchomieniu .. Jesteś świetny .. Jai Ho !! : P
Saurav Kumar
To mi nie działa. Po chwili zamyka terminal. Jestem w Linux Mint, ale nie sądziłem, że to będzie miało znaczenie, ponieważ nadal używam zsh. Jakieś pomysły?
istrasci
28

Jeśli chcesz wyświetlić czas działania w swoim terminalu, możesz użyć tego polecenia. Wyświetli czas w prawym górnym rogu terminala.

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

wprowadź opis zdjęcia tutaj

Należy jednak pamiętać, że wyświetlanie czasu za pomocą tego polecenia może czasami nakładać się na tekst obecny w terminalu. Dlatego używaj tego polecenia z niewielką ostrożnością.

Innym sposobem może być użycie znaku kontrolnego w PS1

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

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

Ale w tej metodzie Twój czas będzie odświeżany dopiero po naciśnięciu Enter.

Jeśli chcesz zastosować powyższą metodę na stałe, dodaj powyższe polecenie (to, które lubisz lub jedno i drugie) do swojego ~.bashrcpliku.

g_p
źródło
Świetny! Jakieś wskazówki, jak zmienić kolor zegara?
Calculus Knight
1
@CalculusKnight, możesz zmienić kod koloru w poleceniu. Możesz odnieść się do tego po kod koloru. misc.flogisoft.com/bash/tip_colors_and_formatting
g_p
1
Działa to IDEALNIE - dziękuję bardzo. Dzwonię z .bashrc, aby powstrzymać zbyt proaktywną zaporę ogniową przed zabijaniem bezczynnych połączeń SSH.
Criggie
11

Jeśli wszystko, co chcesz zrobić, to wyświetlić zegar, użyj date:

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

To pokaże czas co sekundę, dopóki go nie zatrzymasz CtrlC. Jeśli chcesz, aby znajdował się w tym samym wierszu (powyższy wydrukuje nowy wiersz co sekundę), zrób to zamiast tego:

while :; do printf '%s\r' "$(date +%r)"; sleep 1 ; done
terdon
źródło
2

To pytanie przeszkadza mi od kilku dni, a oto mój zredagowany post z całym materiałem, którego się nauczyłem. W szczególności moim celem było osiągnięcie wyświetlania zegara obok monitu w BASH. Podobnie jak wspomniany w odpowiedzi Radu Radeanu, kluczem jest znalezienie funkcji lub zmiennej, która może stale odświeżać wiersz polecenia lub przerysowywać ekran, bez ingerencji w ekran lub w cokolwiek, co wpiszesz. Chociaż można to osiągnąć za pomocą pętli while, jak pokazuje G_P, ciągłe przerysowywanie ekranu za pomocą funkcji tput miesza się z tekstem na moim ekranie w chwili jego odświeżania. Byłem prawie bliski osiągnięcia tego, o co poprosił OP, modyfikując nieco kod opublikowany przez G_P, ale nadal uważam, że odpowiedź Radu jest najbliższa temu, czego chce OP. Bez zbędnych ceregieli, oto niektóre rzeczy, które „

# 1, Moje preferowane rozwiązanie: Multiplekser terminali

Terminal multiplekser to oprogramowanie, które pozwala podzielić ekran terminala na dwa lub więcej ekranów. W szczególności chcę zwrócić uwagę na terminal Byobu. Ten emulator terminala oparty na ncurses pozwala pokazać czas, procent procesora, pamięć i całą masę innych wskaźników. Na zrzucie ekranu z mojego terminala byobu możesz zobaczyć temperaturę procesora, procent baterii, jakość połączenia internetowego, częstotliwość procesora, pamięć RAM, datę i oczywiście czas. Jeśli najbardziej zależy ci na ciągłym monitorowaniu tych rzeczy w terminalu, Byobu jest najlepszym rozwiązaniem. W rzeczywistości bardzo mi się podobało, ustawiłem automatyczne ładowanie podczas logowania do tty. Jedynym dziwactwem jest to, że w tty nie można tak naprawdę łączyć osobnych okien - przełączaj się tylko między kartami za pomocą klawiszy F3 i F4.

Zrzut ekranu mojego terminalu Byobu

Alternatywnym rozwiązaniem polegającym na multipleksowaniu okien jest użycie splitvt, które dzieli ekran na dwie części. Możesz uruchomić zegar terminala, np. tty-clockUżyć komendy watch z datą lub samemu go kodować za pomocą skryptu. Więcej o tym później. Na zrzucie ekranu widać jedną część podziału z normalnym poleceniem bash u góry, aw dolnej widać uruchomiony skrypt, który po prostu stale odświeża wyjście datepolecenia za pomocą clearpolecenia.

wprowadź opis zdjęcia tutaj

# 2, While Do Loop i tput Jest to prawdopodobnie najbliższe temu, co osoba, która zadała pytanie, chciała zaimplementować za pomocą bash.

G_P opublikował świetne rozwiązanie obejmujące polecenia while doi tput. Jednak w kodzie G_P były dwie rzeczy, które mi się nie podobały. Po pierwsze, zegar znajdował się po prawej stronie monitu, a po drugie - ponieważ cykl uśpienia wynosi 1 sekundę (patrz oryginalny kod, w którym jest napisane uśpienie), ekran jest przerysowany co sekundę, co popsuwa mój wynik. To, co zrobiłem, to edytowanie mojego monitu bash, aby był o jeden wiersz niższy z operatorem \ n i zmiana kodu G_P, aby operator tput ustawiał zegar tuż nad pytaniem i odświeżał co 60 sekund; co pozwala mi widzieć godziny i minuty (i nie dbam o minuty), podczas gdy pętla zegara nie psuje mojego ekranu. Po pierwsze, oto moja zachęta:

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

A oto zmodyfikowany kod G_P: enter code here

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

Mała edycja : Zauważyłem, że powyższy kod nie od razu wyświetla zegar. Oto lepsza wersja: while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done & ta najpierw umieszcza zegar na ekranie, a następnie informuje bash, aby przejść przez cykl snu trwający 60 sekund

Uwaga, tput cup 0 0 umieszcza zegar w prawym górnym rogu ekranu, tuż nad monitem, a sen 60 zmienia cykl snu na 60 sekund, ponieważ w ten sposób mogę monitorować tylko godziny i minuty zamiast każdej sekundy. W ten sposób nie wpływa to w żaden sposób na tekst wyświetlany na ekranie (tylko wtedy, gdy uruchamiam polecenie w tym samym czasie, zegar jest odświeżany).

wprowadź opis zdjęcia tutaj

Linia PS1 jest już w twoim profilu .bashrc, więc musisz ją trochę ulepszyć. Pętla while do powinna być dodana gdzieś w tym samym pliku, najlepiej na końcu z komentarzem #, że to jest to, co dodałeś na początku. I nie zapomnij zawsze tworzyć kopii zapasowej każdego takiego pliku na wypadek, gdybyś utworzył bubu i musiał wrócić do poprzedniego stanu.

# 3, Skrypty i inne

Ta część przeznaczona jest tylko dla tych, którzy chcą zobaczyć czas. Dla tych, którzy chcą stale go monitorować, preferowane są opcje # 1 i # 2.

Jak widzieliśmy, pętla while jest całkiem przydatna. Oto, w jaki sposób możesz utworzyć zegar za pomocą komend pętli while, date i sleep.

wprowadź opis zdjęcia tutaj

Naciśnij Return / Enter, a co sekundę zobaczysz wynik polecenia daty na wyczyszczonym ekranie. Jeśli nie chcesz wpisywać tego wszystkiego za każdym razem, zamień wszystkie te rzeczy w skrypt:

#!/bin/bash

while true
do
clear;date
sleep 1
done

Teraz możesz uruchomić ten skrypt z splitvt w jednej instancji bash, podczas gdy w drugiej.

Innym rozwiązaniem jest watch -n1 datepolecenie, które będzie stale wykonywać polecenie daty z okresem 1 sekundy.

Podsumowując: Nauczyłem się kilku rzeczy, próbując znaleźć odpowiedź na to pytanie, i mam nadzieję, że moje odkrycia pomogły wam w jakiś sposób i mam nadzieję, że mogłem przyczynić się do tego pytania. Terminal Byobu IMHO jest najlepszym rozwiązaniem, ale zdecyduj sam, przeprowadź badania i wybierz najlepszą dla siebie metodę.

Niektóre rzeczy, które znalazłem podczas badań:

Mój oryginalny post, minimalistyczne rozwiązanie: Edytuj plik ~ / .bashrc. Wolę edytować go za pomocą nano, więc

nano ~/.bashrc

Oto część mojego edytowanego pliku:

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

Po instrukcji else pierwszy wiersz jest oznaczony komentarzem # (jest to mój stary monit), teraz drugi wiersz jest tym, który chcesz, a konkretnie \toperatorem. To pokazuje czas działania w formacie 24-godzinnym. Aby uzyskać więcej informacji, sprawdź to . Również mała uwaga: używam tych rzeczy po prostu, ponieważ nie używam kolorowych podpowiedzi.

PS: Daj mi znać, czy powinienem dodać coś do mojej odpowiedzi lub edytować ją w jakikolwiek sposób, ale w przeważającej części uważam, że jest to najbardziej rozstrzygająca odpowiedź, jaką mogę wymyślić, a przynajmniej osobiście nic nie dodam nowy w tym.

Sergiy Kolodyazhnyy
źródło
1
Nie wyświetli to „działającego” zegara, jak chce OP. Po prostu doda czas do monitu terminalu.
Parto
2
export PS1='\t$'

odkąd wolą wyświetlania tak mało informacji tle, jak to możliwe na listwie I ogólnie dostosować każdą sesję postaci #, $itd (jeśli chcesz go zmienić na stałe rozwiązanie minerz029 jest doskonały)

Aby go zmodyfikować, aby pokazywał aktualny, mógłbym wybrać

export PS1='\T$'

dla czasu w formacie 12-godzinnym. Możesz zobaczyć dokumentację bash dla innych opcji.

Sojourner
źródło
1

Ten czas zmieni się tylko po wykonaniu nowego monitu

Możesz dodać następujące elementy do .bashrc:

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

Które wytworzą:

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

Więcej informacji tutaj: http://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/#8

Wyszukaj „8. Utwórz własny monit przy użyciu dostępnych kodów dla zmiennej PS1” na powyższej stronie.

kiri
źródło
2
Doceniam twój czas i wysiłek, ale nie tego chcę.
Saurav Kumar,
@SauravKumar Tak, rozumiem, że chcesz mieć uruchomiony zegar. Nie jestem pewien, czy jest to możliwe w przypadku zmiennej „PS1”, może $PROMPT_COMMANDzadziałałoby, jeśli można znaleźć polecenie wyświetlające czas tykania.
kiri
Cóż, myślę, że możesz to zrobić .. :) Wygląda na to, że zbliżyłeś się do rozwiązania ..
Saurav Kumar
dlaczego zawiera \ u dwa razy? @SauravKumar
David
@David: Przepraszam, nie wiem. Ale @ minerz029 prawdopodobnie odpowiedziałby na twoje pytanie. :)
Saurav Kumar
1

Naprawdę podoba mi się funkcja zegara ncmpcpp , uruchamiana przez 0-key (patrz zrzut ekranu). Więcej informacji na temat procedury instalacji można znaleźć w tym poście .

wprowadź opis zdjęcia tutaj

v2r
źródło
1
watch -t -n1 "date +%T|figlet" byłby łatwy sposób.
g_p
1

Pod wpływem g_p i Serga próbowałem stworzyć funkcję w bash. Działa, ale nie jestem pewien, czy dobrym pomysłem jest sprawdzanie polecenia ps co sekundę, aby sprawdzić, czy bash jest procesem fg, czy nie

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
źródło
0

Jeśli nigdy nie musisz go używać debian_chroot, jest to przydatne miejsce, aby ustawić czas wyświetlania wiersza polecenia za pomocą:

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

Wpisz to w swoim terminalu i obserwuj zmiany wiersza poleceń wraz z czasem:

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

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

Po jednokrotnym ustawieniu czasu, aby uzyskać bieżący zegar, który aktualizuje się co sekundę, użyj:

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

To .gifpokazuje polecenia w akcji:

Terminal terminów.gif

WinEunuuchs2Unix
źródło