Как показать рабочие часы в терминале перед командной строкой

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

Если это моя командная строка в терминале:

saurav@saurav-P4I45Gx-PE:~$ 

Затем я хотел бы видеть часы (время) как:

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

или

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

или любой другой формат. где 06:27:01 – время. Я хочу просто показать время, которое изменяется, когда секунды проходят.

Так есть ли способ достичь этого?

Я не уверен, что так просто добиться этого, используя стандартную оболочку bash (но я не говорю, что это невозможно). Вам, вероятно, понадобится команда / функция, которая может обновлять командную строку каждую секунду, не мешая чему-либо, что вы набираете в подсказке.

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

Если вы хотите попробовать, выполните следующие действия:

  1. Установите Z-оболочку с помощью этой команды:

     sudo apt-get install zsh 
  2. Когда вы запускаете zsh в первый раз, выберите 0 когда вас спросят.

  3. Измените файл ~/.zshrc (запустив gedit ~/.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 чтобы сбросить подсказку. Теперь ваше приглашение должно выглядеть так:

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

    с некоторыми цветами.

  5. Если вам это нравится, запустите chsh -s /bin/zsh чтобы изменить текущую оболочку на /bin/zsh (для вступления изменений в силу требуется повторный вход в систему).

  6. Запустите exit если вы хотите выйти из оболочки zsh.

Вот мой 15-секундный скринкаст из моего терминала:

запуск часов в терминале перед командной строкой

Если вы хотите отобразить время работы в терминале, вы можете использовать эту команду. Он отобразит время в верхней правой части вашего терминала.

  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 ~]$ 

Но в этом методе ваше время будет обновляться только после нажатия ввода.

Если вы хотите использовать метод выше, добавьте вышеприведенную команду (тот, который вам нравится или оба) в ваш файл ~.bashrc .

Если все, что вы хотите сделать, это показать часы, просто используйте date :

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

Это покажет время каждую секунду, пока вы не остановите его с помощью Ctrl C. Если вы хотите, чтобы она была на одной строке (выше будет печатать новую строку каждую секунду), сделайте это вместо этого:

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

Этот вопрос беспокоил меня в течение нескольких дней, и вот мой отредактированный пост со всем материалом, который я узнал. В частности, моя цель состояла в том, чтобы показать показ часов рядом с подсказкой в ​​BASH. Как сказал Раду Радеану в своем ответе, ключ состоит в том, чтобы найти функцию или переменную, которая может постоянно обновлять командную строку или перерисовывать экран, не мешая вашему экрану или типу. Хотя это можно достичь с помощью цикла while, как показано G_P, постоянная перерисовка экрана с функцией tput беспорядочна с любым текстом на моем экране в тот момент, когда он обновляется. Я подошел довольно близко к достижению того, что спросил ОП, несколько изменив код G_P, но все же я считаю, что ответ Раду является самым близким к тому, что хочет OP. Без дальнейших церемоний, вот некоторые из вещей, которые я узнал, представлены для вашего суждения.

# 1, Мое предпочтительное решение: Терминальный мультиплексор

Терминальный мультиплексор – это программное обеспечение, которое позволяет разбивать экран терминала на два или более экранов. В частности, я хочу обратить внимание на терминал Byobu. Этот эмулятор терминала, основанный на ncurses, позволяет показывать время, процент CPU, память и целую группу других индикаторов. На скриншоте с моего терминала byobu вы можете увидеть температуру процессора, процентную ставку батареи, качество интернет-соединения, частоту процессора, оперативную память, дату и, конечно, время. Если вы в основном озабочены постоянным наблюдением за этими вещами, находясь в терминале, Byobu – это путь. На самом деле, мне так понравилось, я установил его для автоматической загрузки при входе в tty. Единственный причуд в том, что в tty вы не можете фактически объединить отдельные окна – только переключайтесь между вкладками с клавишами F3 и F4.

Снимок экрана моего терминала byobu

Альтернативное решение, включающее мультиплексирование окон, – это использование splitvt , которое разбивает экран на две части. Вы можете запускать терминальные часы, такие как tty-clock , использовать команду watch с датой, или вы можете сами написать код с помощью скрипта. Об этом позже. На скриншоте вы можете увидеть одну часть раскола с обычной подсказкой bash сверху, а в нижней – скрипт, который просто постоянно обновляет вывод команды date командой clear .

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

# 2, While Do Loop и tput. Это, вероятно, связано с тем, что человек, который задал вопрос, хотел реализовать с bash.

G_P опубликовал большое решение, включающее команды while do и tput . Однако в коде G_P было две вещи, которые мне не нравились. Один, часы были справа от подсказки, а два – потому что цикл сна составляет 1 секунду (см. Исходный код, где он говорит «сон»), экран перерисовывается каждую секунду, и это мешает моему результату. То, что я сделал, – это изменить мое приглашение bash на одну строку ниже с помощью оператора \ 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 & while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done & while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done & This сначала помещает часы на экран, а затем позволяет bash знать, чтобы пройти цикл сна 60 секунд

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

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

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

# 3, Сценарии и другие

Эта часть предназначена только для тех, кто хочет видеть время. Для тех, кто хочет постоянно контролировать его, предпочтительными являются # 1 и # 2.

Итак, как мы уже видели, цикл while do довольно полезен. Вот как вы можете создавать часы с циклами while, date и sleep.

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

Hit return / enter, и вы в основном увидите вывод команды даты, отображаемой на очищенном экране каждую секунду. Если вы не хотите набирать все это каждый раз, превратите все это в скрипт:

 #!/bin/bash while true do clear;date sleep 1 done 

Теперь вы можете запустить этот скрипт с помощью splitvt в одном экземпляре bash, работая в другом.

Другим решением является watch -n1 date , которая будет непрерывно выполнять команду даты с периодом в 1 секунду.

В заключение: Я кое-чему научился, пытаясь найти ответ на этот вопрос, и надеюсь, что мои выводы помогли вам каким-то образом, и я надеюсь, что смогу внести свой вклад в этот вопрос. Byobu терминал IMHO – лучшее решение, но решите для себя, сделайте некоторые исследования и выберите, какой из способов лучше всего подходит для вас.

Некоторые из вещей, которые я нашел, исследуя:

  • Повторить команду в Unix
  • Некоторые примеры подсказок Bash
  • Плавающая синхронизация часов

Мой оригинальный пост, минималистичное решение: отредактируйте файл ~ / .bashrc. Я предпочитаю редактировать его с помощью nano, поэтому

 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 

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

PS: Пожалуйста, дайте мне знать, если я должен что-либо добавить к моему ответу или изменить его каким-либо образом, но, по большей части, я считаю, что это самый убедительный ответ, который я мог бы придумать, и, по крайней мере, я лично ничего не добавлю новый для него.

Это время будет изменяться только при выполнении нового приглашения

Вы можете добавить следующее в свой .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» на этой странице выше.

Мне очень нравится функция часов ncmpcpp , вызванная 0- клавишей (см. Снимок экрана). Подробнее о процедуре установки см. В этом сообщении .

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

 export PS1='\t$' 

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

Чтобы изменить его, чтобы показать текущий, я мог бы пойти

 export PS1='\T$' 

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

Под влиянием 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& } , 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& }