Як показати годинник, що працює в терміналі перед командним рядком


40

Я вважаю за краще використовувати термінал і більшу частину часу провожу його. Я шукаю спосіб бачити час у терміналі, а паралельно використовую його. Час змінюється автоматично, коли він проходить. Було б приголомшливо, якби воно відображалося зліва в моєму командному рядку.

Якщо це мій командний рядок у терміналі:

saurav@saurav-P4I45Gx-PE:~$

Тоді я хотів би бачити годинник (час) як:

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

або

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

або будь-який інший формат. де 06:27:01час. Я хочу лише показати час, який змінюється, коли проходять секунди.

То чи є спосіб досягти цього?


Можливо, ви зможете встановити $PS1змінну (підказка), щоб мати час, але я не впевнений, що зміни.
kiri

Ви можете вказати \@, але час буде перераховано лише щоразу, коли відображається підказка, а не поточний час.
кірі

2
@muru, Як я вказав у своєму запитанні, ця відповідь працює лише для zsh, а не для bash.
Rosh_Th

2
Але саме питання не стосується zsh (це загальне), тому я порадив G_P опублікувати відповідь там. Оскільки відповідь G_P тепер додана туди, вона кваліфікується як дура.
муру

1
@muru, що інше питання спеціально бажає часу в підказці. ОП тут просто хоче, щоб він був надрукований в терміналі, і не вказував, що він повинен бути в підказці.
terdon

Відповіді:


74

Я не впевнений, що це так просто досягти, використовуючи базову оболонку bash (але я не кажу, що це неможливо). Ймовірно, вам знадобиться команда / функція, яка здатна оновлювати командний рядок щосекунди, не втручаючись у все, що ви вводите в підказку.

Z оболонки (ЗШ) має вбудовану команду, під назвою zle, яке, коли використовується з reset-promptаргументом, сили запрошення бути повторно розширена, а потім повторно відображає буфер редагування.

Якщо ви хочете спробувати, виконайте такі дії:

  1. Встановіть оболонку Z за допомогою цієї команди:

    sudo apt-get install zsh
    
  2. Коли ви запускаєтесь zshвперше, вибирайте, 0коли вас запитають.

  3. Відредагуйте ~/.zshrcфайл та додайте наступні рядки:

    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
    }
    

    Збережіть файл і закрийте його.

  4. У терміналі, коли ви все ще використовуєте zsh, запустіть source ~/.zshrcабо просто zsh, щоб скинути своє запит. Тепер ваш запит повинен виглядати так:

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

    з деякими кольорами.

  5. Якщо вам це подобається, запустіть, chsh -s /bin/zshщоб змінити поточну оболонку на /bin/zsh(для того, щоб ця зміна набула чинності, потрібен повторний вхід).

  6. Запустіть, exitякщо ви хочете вийти з оболонки zsh.

Ось 15-секундний екран із мого терміналу:

запущений годинник в терміналі перед командним рядком


4
Бонусні бали за показ екрана. Класні речі справді.
MadMike

@SauravKumar Запустіть, chshщоб змінити стандартну оболонку з /bin/bashна /bin/zsh. Ви повинні вийти та знову увійти.
Radu Rădeanu

Насправді я це зробив .. Але кожен раз, коли відкриється термінал, я повинен виконувати zshкоманду, щоб увійти в цей годинниковий режим ..
Саурав Кумар

@ RaduRădeanu: Так працював після входу в систему, а також перезавантаження .. Ти чудовий .. Jai Ho !! : P
Саурав Кумар

Це не працює для мене. Через одну секунду він закриває термінал. Я в Linux Mint, але не думав, що це матиме значення, оскільки я все ще використовую zsh. Будь-які ідеї?
istrasci

28

Якщо ви хочете відобразити час роботи у своєму терміналі, ви можете скористатися цією командою. Він відображатиме час у верхній правій частині терміналу.

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

введіть тут опис зображення

Але зауважте, що показ часу за допомогою цієї команди колись може перекривати текст, присутній у терміналі. Тому використовуйте цю команду з невеликою обережністю.

Іншим способом може бути використання керуючого символу в PS1

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

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

Але в цьому способі ваш час оновиться лише після натискання клавіші Enter.

Якщо ви хочете, щоб вищезазначений метод був постійним, додайте у свій ~.bashrcфайл вищевказану команду (ту, яка вам подобається або обидві) .


Чудово! Будь-які підказки щодо того, як змінити колір годинника?
Лицар обчислення

1
@CalculusKnight, ви можете змінити колірний код у команді. Ви можете вказати це на колірний код. misc.flogisoft.com/bash/tip_colors_and_formatting
g_p

1
Це працює ПЕРЕФЕКТНО - дуже дякую. Я закликаю це від .bashrc, щоб зупинити надмірно активний брандмауер від заборонених SSH-з'єднань.
Criggie

11

Якщо все, що ви хочете зробити, це показати годинник, просто використовуйте date:

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

Це покаже час щосекунди, поки ви не зупините його CtrlC. Якщо ви хочете, щоб це було в одному рядку (вище буде друкувати новий рядок щосекунди), зробіть це замість цього:

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

2

Це питання мене турбує вже кілька днів, і ось моя відредагована публікація з усім вивченим матеріалом. Зокрема, моя мета полягала в тому, щоб домогтися показу годинника поруч із підказкою в BASH. Так само, як згадував Раду Радеану у своїй відповіді, головне - знайти функцію або змінну, яка здатна постійно оновлювати командний рядок або перемальовувати екран, не втручаючись у ваш екран або з тим, що ви вводите. Хоча цього можна досягти за допомогою циклу while, як показано G_P, постійне перемальовування екрана за допомогою функції tput змішується з будь-яким текстом на моєму екрані в той момент, коли він оновлюється. Я підійшов досить близько до досягнення того, що запитував ОП, змінивши дещо змінений код G_P, але все ж я вважаю, що відповідь Раду є найближчим до того, чого хоче ОП. Без зайвої приналежності, ось деякі речі, які я '

№1, Моє бажане рішення: Термінальний мультиплексор

Термінальний мультиплексор - це програмне забезпечення, яке дозволяє розділити екран терміналу на два або більше екранів. Зокрема, хочу звернути увагу на термінал Byobu. Цей емулятор терміналу на основі ncurses дозволяє показувати час, відсоток процесора, пам'ять та цілу купу інших показників. На скріншоті з мого терміналу byobu ви бачите температуру процесора, відсоток заряду акумулятора, якість підключення до Інтернету, частоту процесора, оперативну пам’ять, дату і звичайно час. Якщо ви в основному переймаєтесь постійним моніторингом цих речей, перебуваючи в терміналі, Byobu - це шлях. Насправді мені так подобається, я налаштував його автоматично завантажуватись під час входу в tty. Єдина хитрість полягає в тому, що в tty фактично ви не можете об'єднати окремі вікна - перемикатися між вкладками лише клавішами F3 та F4

Знімок екрана мого терміналу byobu

Альтернативне рішення, що включає вікна мультиплексування, - це використання splitvt, яке розбиває екран на дві частини. Ви можете запустити термінальний годинник, наприклад tty-clock, скористатися командою watch з датою, або ви можете кодувати його за допомогою сценарію. Детальніше про це пізніше. На скріншоті ви бачите одну частину розбиття з звичайним баш-підказкою вгорі, а в нижній - сценарій, що працює, який постійно оновлює вихід dateкоманди з clearкомандою.

введіть тут опис зображення

# 2, Хоча робити цикл і тпут. Це, мабуть, те, що людина, яка задала питання, хотіла реалізувати з bash.

G_P опублікував чудове рішення, що включає команди while doта tputкоманди. Однак у коді G_P було дві речі, які мені не сподобалися. Один, годинник знаходився праворуч від підказки, і два - оскільки цикл сну становить 1 секунду (див. Первинний код, де написано сон), екран переробляється щосекунди, і це псує мій вихід. Що я зробив, - це відредагувати баш-запит на один рядок нижче за допомогою оператора \ n та змінити код G_P, щоб оператор tput розмістив годинник прямо над підказкою та оновив кожні 60 секунд; це дозволяє мені бачити години і хвилини (і мене точно не хвилюють хвилини), тоді як петля годинника не псує мій екран. По-перше, ось мій підказки:

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

А ось модифікований код G_P: enter code here

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

Невелике редагування : я помітив, що цей код вище не часом відображає годинник. Ось краща версія: while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done & Цей кладе годинник спочатку на екран, а потім дає зрозуміти, щоб пройти цикл сну 60 секунд

Зауважте, чашка tput 0 0 розміщує годинник у верхньому правому куті екрана, праворуч над моїм підказкою і сплячим режимом 60 змінює цикл сну на 60 секунд, тому що я можу спостерігати лише години та хвилини замість кожної секунди. Таким чином, на будь-який текст, який я маю на екрані, здебільшого не впливає (лише тоді, коли я запускаю команду в той же час, оновлюється годинник).

введіть тут опис зображення

Рядок PS1 вже є у вашому профілі .bashrc, тому вам просто потрібно його трохи підправити. Цикл while do слід додати десь у тому самому файлі, бажано врешті з # коментарем, що це матеріал, який ви додали спочатку. І не забувайте завжди створювати резервну копію будь-якого такого файлу на всякий випадок, якщо ви створюєте бульбу і вам потрібно повернутися до того, яким він був.

№3, Сценарій та ін

Ця частина лише для тих, хто хоче побачити час. Для тих, хто хоче постійно стежити за цим, №1 та №2 є кращими варіантами.

Тому, як ми вже бачили цикл do do, це дуже корисно. Ось як можна створити годинник за допомогою команд циклу циклів, дати та сну.

введіть тут опис зображення

Натисніть кнопку return / enter, і ви в основному побачите вихідну команду дати, яка відображається на очищеному екрані щосекунди. Якщо ви не хочете кожен раз вводити це, перетворіть усі ці речі на сценарій:

#!/bin/bash

while true
do
clear;date
sleep 1
done

Тепер ви можете запустити цей скрипт зі splitvt в одному екземплярі bash, працюючи в іншому.

Ще одне рішення - watch -n1 dateкоманда, яка буде постійно виконувати команду дати з періодом 1 секунди.

На закінчення : я дізнався деякі речі, намагаючись знайти відповідь на це питання, і я сподіваюся, що мої висновки допомогли вам певним чином, і я сподіваюся, що я зміг зробити свій внесок у це питання. Термінал Byobu IMHO - найкраще рішення, але вирішіть самі, зробіть кілька досліджень та виберіть той спосіб, який найкраще підійде для вас.

Деякі речі, які я знайшов під час дослідження:

Моя оригінальна публікація, мінімалістичне рішення: Відредагуйте файл ~ / .bashrc. Я вважаю за краще редагувати його нано, так

nano ~/.bashrc

Ось частина мого власного відредагованого файлу:

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

Після іншої заяви перший рядок коментується # (це моя стара підказка), тепер другий рядок - той, який ви хочете, а конкретно \tоператор. Це показує час роботи у форматі 24 години. Для отримання додаткової інформації перевірте це . Також невеличка примітка, я використовую речі після іншого, тому що я не використовую кольоровий рядок.

PS: Будь ласка, дайте мені знати, чи повинен я щось додати до своєї відповіді чи будь-яким чином відредагувати її, але здебільшого я вважаю, що це найбільш переконлива відповідь, яку я міг би придумати, і принаймні я особисто нічого не додаю. нова для нього.


1
Це не відображатиме годинник, що працює, як хоче. Це просто додасть час на підказку терміналу.
Парто

2
export PS1='\t$'

оскільки я вважаю за краще відображати якомога менше фонової інформації на терміналі, я зазвичай налаштовую кожен сеанс як a #, $і т. д. (якщо ви хочете його постійно змінити, рішення minerz029 ідеально)

Щоб змінити його на показ поточного, я міг би перейти

export PS1='\T$'

час у форматі 12 годин. Ви можете переглянути документацію bash для інших параметрів.


1

Цей час зміниться лише тоді, коли буде виконано нове запит

Ви можете додати до свого .bashrc:

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

Який буде виробляти:

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

Більше інформації тут: http://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/#8

Шукайте "8. Створіть власну підказку, використовуючи доступні коди змінної PS1" на цій вище сторінці.


2
Я вдячний за ваш час і зусилля, але це не те, чого я хочу ..
Саурав Кумар

@SauravKumar Так, я розумію, ти хочеш біг годинника. Я не впевнений, чи можливо це за допомогою змінної 'PS1', можливо, $PROMPT_COMMANDце спрацює, якщо ви зможете знайти команду, яка відображає час відмітки.
kiri

Ну, я думаю, ви можете це зробити .. :) Здається, ви вже досягли рішення ...
Саурав Кумар

чому він включає \ u два рази? @SauravKumar
David

@David: Вибачте, я не знаю. Але @ minerz029 напевно відповів би на ваше запитання. :)
Саурав Кумар


1

Під впливом g_p та Serg я намагався створити функцію в bash. Це працює, але я не впевнений, що це гарна ідея перевірити команду ps щосекунди, щоб побачити, чи є bash процесом fg чи ні

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&
}

0

Якщо вам ніколи не потрібно користуватися, debian_chrootто це зручне місце, щоб викласти час відображення командного рядка, використовуючи:

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

Введіть це у свій термінал і спостерігайте за тим, як змінюється командна строка з часом:

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

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

Після встановлення часу один раз, щоб отримати годинник, що працює, який оновлює кожне друге використання:

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

Це .gifпоказує команди в дії:

Підказка терміналу.gif

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.