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


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

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

saurav@saurav-P4I45Gx-PE:~$

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

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

или

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

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

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


31
2017-10-17 01:11


происхождения


Возможно, вы сможете установить $PS1 (подсказка), чтобы иметь время, но я не уверен, если изменения. - kiri
@ minerz029: Готово !! - Saurav Kumar
@muru, Как я указал в своем вопросе, этот ответ работает только для zsh не для bash. - Rosh_Th
Но сам вопрос не о zsh (это вообще), поэтому я посоветовал G_P опубликовать там ответ. Теперь, когда добавлен ответ G_P, он квалифицируется как обман. - muru
@muru, что другой вопрос конкретно хочет время в подсказке. ОП здесь просто хочет, чтобы он был напечатан в терминале и не указал, что он должен быть в подсказке. - terdon♦


ответы:


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

Z-оболочка (zsh) имеет встроенную команду, называемую 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-секундный скринкаст из моего терминала:

running clock in terminal before the command prompt


61
2017-10-17 08:54



Бонусные очки для скринкаста. Действительно классный. - MadMike
Вау!! Работайте отлично! Вот почему я называю тебя Потрясающие :) Еще одна вещь, как сделать ее постоянной. Я запустил его, когда я запустил терминал. - Saurav Kumar
@SauravKumar Run chsh изменить оболочку по умолчанию из /bin/bash в /bin/zsh, Вы должны выйти и войти снова. - Radu Rădeanu
На самом деле я это сделал. Но каждый раз, когда терминал открывается, я должен выполнить zsh для входа в этот режим часов. - Saurav Kumar
@ RaduRădeanu: Да работал после входа в систему, а также перезапуска. Вы здорово .. Jai Ho !! :П - Saurav Kumar


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

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

enter image description here

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

Другой путь может использоваться управляющий символ в PS1

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

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

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

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


25
2017-09-20 07:23



Большой! Любые подсказки относительно того, как изменить цвет часов? - Calculus Knight
@CalculusKnight, вы можете изменить цветовой код в команде. Вы можете ссылаться на это для цветового кода.misc.flogisoft.com/bash/tip_colors_and_formatting - g_p
Это работает ОТЛИЧНО - большое вам спасибо. Я вызываю это из .bashrc, чтобы остановить чрезмерно активный брандмауэр от убийства простоя SSH-соединений. - Criggie


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

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

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

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

10
2017-09-20 11:43





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

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

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

Screenshot of my byobu terminal

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

enter image description here

# 2, в то время как 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 &  Сначала он помещает часы на экран, а затем позволяет понять, как пройти через цикл сна 60 секунд

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

enter image description here

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

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

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

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

enter image description here

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

#!/bin/bash

while true
do
clear;date
sleep 1
done

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

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

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

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

Мой оригинальный пост, минималистичное решение: Отредактируйте файл ~ / .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: Пожалуйста, дайте мне знать, если я должен что-то добавить к моему ответу или отредактировать его каким-либо образом, но по большей части я считаю, что это самый убедительный ответ, который я мог бы придумать, и, по крайней мере, я лично не добавлю ничего нового к Это.


2
2017-09-20 08:08



Это не отображает «рабочие» часы, как хочет OP. Он просто добавит время в подсказку терминала. - Parto


export PS1='\t$'

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

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

export PS1='\T$'

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


2
2017-10-14 20:59





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

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


1
2017-10-17 01:44



Я ценю ваше время и силы, но это не то, что я хочу. - Saurav Kumar
@SauravKumar Да, я понимаю, что вы хотите Бег Часы. Я не уверен, возможно ли это с переменной «PS1», возможно $PROMPT_COMMAND будет работать, если вы можете найти команду, которая отображает время тикания. - kiri
Ну, я думаю, вы можете это сделать .. :) Кажется, вы приблизились к решению .. - Saurav Kumar
почему он включает \ и два раза ? @SauravKumar - David
@David: Извините, я не знаю. Но @ minerz029 вероятно, ответит на ваш вопрос. :) - Saurav Kumar


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

enter image description here


1
2017-09-20 09:38



watch -t -n1 "date +%T|figlet"  было бы легко. - g_p


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

1
2017-11-08 11:16