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.
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-clock
Uż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 date
polecenia za pomocą clear
polecenia.
# 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 do
i 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).
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.
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 date
polecenie, 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 \t
operatorem. 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.
$PS1
zmienną (monit), aby mieć czas, ale nie jestem pewien, czy zmiany.