Я предпочитаю использовать терминал и проводить большую часть времени, используя его. Я ищу способ увидеть время в терминале, пока я использую его параллельно. Время изменится автоматически, когда оно пройдет. Было бы здорово, если бы он отображался слева от моей командной строки.
Если это моя командная строка в терминале:
saurav@saurav-P4I45Gx-PE:~$
Тогда я хотел бы видеть часы (время) как:
saurav@saurav-P4I45Gx-PE[06:27:01]:~$
или
saurav@(06:27:01):~$
[ 118] или любой другой формат. где 06:27:01
время. То, что я хочу, это просто показать время, которое меняется, когда проходят секунды.
Так есть ли способ достичь этого?
Я не уверен, что добиться этого с помощью оболочки bash по умолчанию так просто (но я не говорю, что это невозможно). Вам, вероятно, понадобится команда / функция, которая может обновлять командную строку каждую секунду, не мешая тому, что вы вводите в командной строке.
Оболочка Z (zsh) имеет встроенную команду zle
, которая при использовании с аргументом reset-prompt
заставляет запрос на повторное раскрытие, затем повторно отображает буфер редактирования.
Если вы хотите попробовать, выполните следующие действия:
Установите оболочку Z с помощью этой команды:
sudo apt-get install zsh
Когда вы запускаете zsh
в первый раз, при появлении запроса выберите 0
.
Отредактируйте файл ~ / .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
}
Сохраните файл и закройте его.
В терминале, когда вы все еще используете zsh, запустите source ~ / .zshrc
или просто zsh
, чтобы сбросить настройки незамедлительный. Теперь ваше приглашение должно выглядеть так:
saurav @ saurav-P4I45Gx-PE [1:25:21]: ~ $
с некоторыми цветами.
Если вам это нравится, запустите chsh -s / bin / zsh
, чтобы изменить текущую оболочку на / bin / zsh
(повторный вход требуется для того, чтобы это изменение вступило в силу).
Запустите exit
, если хотите выйти из оболочки zsh.
Вот 15-секундный скринкаст из моего терминала:
export PS1='\t$'
, поскольку я предпочитаю отображать как можно меньше фоновая информация, насколько это возможно на терминале. Обычно я настраиваю каждую сессию как #
, $
и т. д. (если вы хотите изменить ее навсегда, решение minerz029 идеально подходит)
измените его, чтобы показать ток, я мог бы выбрать
export PS1='\T$'
для времени в 12-часовом формате. Вы можете просмотреть другие параметры в документации bash.
Это время изменится только при выполнении нового приглашения
Вы можете добавить следующее в свой .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 (см. Снимок экрана). Более подробную информацию о процедуре установки см. В этом сообщении .
Под влиянием 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&
}
Этот вопрос беспокоит меня несколько дней, и вот мой отредактированный пост со всем материалом, который я изучил. В частности, моей целью было добиться отображения часов рядом с подсказкой в BASH. Как и Раду Радеану в своем ответе, главное - найти функцию или переменную, которая может постоянно обновлять командную строку или перерисовывать экран, не мешая вашему экрану или тому, что вы набираете. Хотя этого можно достичь с помощью цикла while, как показано G_P, постоянная перерисовка экрана с помощью функции tput противоречит любому тексту на моем экране в момент его обновления. Я довольно близко подошел к тому, что просил OP, немного изменив код, опубликованный G_P, но все же я считаю, что ответ Раду является наиболее близким к тому, что хочет OP. Без лишних слов, вот некоторые вещи, которые я узнал и представил на ваше рассмотрение.
# 1, Мое предпочтительное решение: Терминальный мультиплексор
Терминальный мультиплексор - это программное обеспечение, которое позволяет разделить экран терминала на два или более экранов. . В частности, хочу обратить внимание на терминал Byobu. Этот эмулятор терминала на основе ncurses позволяет отображать время, процентное соотношение ЦП, память и множество других индикаторов. На скриншоте с моего терминала byobu вы можете увидеть температуру процессора, процент заряда батареи, качество интернет-соединения, частоту процессора, оперативную память, дату и, конечно же, время. Если вас больше всего беспокоит постоянный мониторинг этих вещей в терминале, Byobu - это то, что вам нужно. На самом деле, мне это так понравилось, что я настроил его на автоматическую загрузку при входе в tty. Единственная особенность заключается в том, что в tty вы не можете объединить отдельные окна - переключаться между вкладками можно только с помощью клавиш F3 и F4.
Альтернативное решение, включающее мультиплексирование окон, - использование splitvt
,который разбивает экран на две части. Вы можете запустить часы терминала, такие как tty-clock
, использовать команду watch с датой или сами запрограммировать их с помощью скрипта. Подробнее об этом позже.
На скриншоте вы можете увидеть одну часть разделения с обычным приглашением bash вверху, а в нижней части вы можете увидеть запущенный скрипт, который просто постоянно обновляет вывод команды date
с помощью clear
команда.
# 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 секунд, потому что таким образом я могу отслеживать только часы и минуты, а не каждую секунду. Таким образом, любой текст, который у меня есть на экране, по большей части не затрагивается (только когда я запускаю команду в то же время, когда часы обновляются).
Строка PS1 уже находится в вашем профиле .bashrc, поэтому вы просто нужно немного подправить. Цикл while do должен быть добавлен где-нибудь в том же файле, желательно в конце с комментарием #, что это то, что вы добавили изначально. И не забывайте всегда делать резервную копию любого такого файла на тот случай, если вы создадите бубу и вам нужно будет вернуться к тому, как было.
# 3, Скрипты и другие
Эта часть предназначена только для тех, кто хочет чтобы увидеть время. Для тех, кто хочет постоянно следить за ним, предпочтительны варианты №1 и №2.
Итак, как мы уже видели, цикл while do довольно полезен. Вот как вы можете создать часы с помощью команд while do loop, date и sleep.
Нажмите 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: Пожалуйста, дайте мне знать, следует ли мне добавить что-нибудь к своему ответу или отредактировать его каким-либо образом, но по большей части я считаю, что это наиболее убедительный ответ, который я мог придумать, и, по крайней мере, я лично не будет добавлять к нему ничего нового.
Если вы хотите отображать время работы в вашем терминале, вы можете использовать эту команду. Время будет отображаться в верхнем правом углу вашего терминала.
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
Если вам никогда не нужно использовать 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
показывает команды в действии:
Напишите загружаемую встроенную программу для 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
Результаты моих экспериментов: