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

40

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

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

saurav@saurav-P4I45Gx-PE:~$

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

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

или

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

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

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

Саурав Кумар
источник
Вы могли бы установить $PS1переменную (prompt), чтобы иметь время, но я не уверен, что изменения.
Кири
Вы можете указать \@, но время будет пересчитываться только каждый раз, когда отображается подсказка, а не текущее время.
Кири
2
@muru, как я указал в своем вопросе, этот ответ работает только для zsh, а не для bash.
Rosh_Th
2
Но сам вопрос не о zsh (он общий), поэтому я посоветовал G_P опубликовать ответ там. Теперь, когда ответ G_P добавлен, он квалифицируется как обман.
муру
1
@muru, что другой вопрос специально хочет время в приглашении. ОП здесь просто хочет, чтобы он был напечатан в терминале, и не указывает, что он должен быть в приглашении.
Тердон

Ответы:

74

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

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

Если вы хотите попробовать это, используйте следующие шаги:

  1. Установите Z shell с помощью этой команды:

    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. Вы должны выйти и войти снова.
Раду Рэдяну
На самом деле я сделал это .. Но каждый раз, когда открывается терминал, я должен выполнить 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файл.

G_p
источник
Большой! Любые подсказки относительно того, как изменить цвет часов?
Исчисление рыцаря
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, Мое предпочтительное решение: терминальный мультиплексор

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

Скриншот моего терминала в бёбу

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

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

# 2, Пока 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 & эти часы сначала помещают часы на экран, а затем сообщают, что bash проходит цикл сна продолжительностью 60 секунд.

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

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

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

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

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

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

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

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

#!/bin/bash

while true
do
clear;date
sleep 1
done

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

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

В заключение: я узнал некоторые вещи, пытаясь найти ответ на этот вопрос, и я надеюсь, что мои выводы каким-то образом помогли вам, и я надеюсь, что смог внести свой вклад в этот вопрос. Терминал Бёбу ИМХО - лучшее решение, но решите сами, проведите исследование и выберите тот способ, который вам больше подходит.

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

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

Сергей Колодяжный
источник
1
Это не будет отображать «бегущие» часы, как того хочет ОП. Это просто добавит время к подсказке терминала.
Парто
2
export PS1='\t$'

так как я предпочитаю отображать как мало вводной информации , как это возможно на терминале я вообще настроить каждую сессию в виде #, $и т.д. (если вы хотите , чтобы изменить его навсегда, решение 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, сработает, если вы сможете найти команду, которая отображает время тика.
Кири
Ну, я думаю, что вы можете сделать это .. :) Кажется, что вы достигли близко к решению ..
Саурав Кумар
почему она включает в себя \ и два раза? @SauravKumar
Дэвид
@ Давид: извините, я не знаю. Но @ minerz029, вероятно, ответит на ваш вопрос. :)
Саурав Кумар
1

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

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

V2R
источник
1
watch -t -n1 "date +%T|figlet" было бы простым способом.
g_p
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показывает команды в действии:

Временной терминал prompt.gif

WinEunuuchs2Unix
источник