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

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

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

saurav@saurav-P4I45Gx-PE:~$

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

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

или

saurav@(06:27:01):~$
[ 118] или любой другой формат. где 06:27:01 время. То, что я хочу, это просто показать время, которое меняется, когда проходят секунды.

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

48
задан 24 September 2014 в 17:54

10 ответов

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

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

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

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

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

  3. Отредактируйте файл ~ / .zshrc и добавьте следующие строки:

     setopt PROMPT_SUBST
    PROMPT = '% B% F {красный}% n @% m% f% F {желтый} [% D {% L:% M:% S}]% f:% F {синий} $ {$ {(%  ): -% ~}}% 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

84
ответ дан 24 September 2014 в 17:54
export PS1='\t$'

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

измените его, чтобы показать ток, я мог бы выбрать

export PS1='\T$'

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

3
ответ дан 24 September 2014 в 17:54

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

Вы можете добавить следующее в свой .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
ответ дан 24 September 2014 в 17:54

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

enter image description here

1
ответ дан 24 September 2014 в 17:54

Под влиянием 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
ответ дан 24 September 2014 в 17:54

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

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

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

Screenshot of my byobu terminal

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

enter image description here

# 2, while Do Loop и tput Это, вероятно, близость к тому, что человек, задавший вопрос, хотел реализовать с помощью bash.

G_P опубликовал отличное решение, включающее команды и do и tput . Однако в коде G_P мне не нравились две вещи. Во-первых, часы были справа от приглашения, а во-вторых, поскольку цикл сна составляет 1 секунду (см. Исходный код, в котором говорится, что сон), экран перерисовывается каждую секунду, и это портит мой вывод. Что я сделал, так это отредактировал мое приглашение bash на одну строку ниже с помощью оператора \ n и изменил код G_P, чтобы оператор tput располагал часы прямо над приглашением и обновлялся каждые 60 секунд; Это позволяет мне видеть часы и минуты (а минуты меня не волнуют), в то время как цикл часов не портит мой экран. Во-первых, вот моя подсказка:

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

А вот модифицированный код G_P: введите код здесь

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

Небольшое изменение : Я заметил, что этот код выше иногда не запускает часы сразу. Вот лучшая версия: пока верно; do tput sc; tput cup 0 0; date +% R; tput rc; спать 60; done & Это сначала помещает часы на экран, а затем сообщает bash, что нужно пройти цикл сна в 60 секунд

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

enter image description here

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

# 3, Скрипты и другие

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

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

enter image description here

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

#!/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-часовом формате. Для получения дополнительной информации посетите этот . Также небольшое примечание: я использую этот материал после else, потому что я не использую цветные подсказки.

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

2
ответ дан 24 September 2014 в 17:54

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

  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 .

33
ответ дан 24 September 2014 в 17:54

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

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

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

while :; do printf '%s\r' "$(date +%r)"; sleep 1 ; done
13
ответ дан 24 September 2014 в 17:54

Если вам никогда не нужно использовать 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 показывает команды в действии:

Time terminal prompt.gif

1
ответ дан 9 October 2019 в 15:25

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

Здесь предлагается хорошая точка входа в тему

Я вызвал загружаемую встроенную команду reprompt , и ее исходный код выглядит примерно так:

...
#include "readline/rlprivate.h"

...

int
reprompt_builtin (list)
     WORD_LIST *list;
{
  rl_set_prompt (list->word->word);
  return (EXECUTION_SUCCESS);
}

...

struct builtin reprompt_struct = {
  "reprompt",    /* builtin name */
  reprompt_builtin,  /* function implementing the builtin */
  BUILTIN_ENABLED,  /* initial flags for builtin */
  "reprompt [prompt]",     /* usage synopsis */
  0      /* reserved for internal use */
};

Скомпилируйте и установите загружаемый встроенный файл. Используйте его следующим образом:

enable -f /usr/lib/bash/reprompt reprompt

function Login::ps () {
  declare -gx PS1="$(your_custom_ps_generator_function)"
}

export PROMPT_COMMAND="Login::ps"

trap 'Login::ps; reprompt "$PS1";' SIGWINCH

Результаты моих экспериментов: terminal resize prompt update preview

0
ответ дан 5 January 2021 в 23:18

Другие вопросы по тегам:

Похожие вопросы: