如何在命令提示符前在终端中显示运行时钟


40

我更喜欢使用终端,并花费大部分时间使用它。我正在寻找一种在终端并行使用时查看时间的方法。时间过后,时间将自动更改。如果它显示在我的命令提示符下,那就太棒了。

如果这是我在终端中的命令提示符:

saurav@saurav-P4I45Gx-PE:~$

然后我想将时钟(时间)视为:

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

要么

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

或其他任何格式。现在几点06:27:01了 我想要的只是显示经过几秒钟后发生变化的时间。

那么有什么办法可以做到这一点?


您可能可以将$PS1(提示)变量设置为有时间,但是我不确定是否会更改。
kiri

您可以指定\@,但是只会在每次显示提示时重新计算时间,而不是当前时间。
kiri

2
@muru,正如我在问题中指定的那样,该答案仅适用于zsh,不适用于bash。
Rosh_Th 2014年

2
但是问题本身不是关于zsh的问题(这是一般性问题),因此我建议G_P在此处发布答案。现在在这里添加了G_P的答案,就可以视为骗子。
muru

1
@muru另一个问题特别需要在提示时间。此处的OP仅希望将其打印在终端中,而不指定它必须在提示中。
terdon

Answers:


74

我不确定使用默认的bash shell来实现这一目标是如此简单(但是我并不是说这是不可能的)。您可能需要一个命令/功能,该命令/功能能够每秒刷新命令提示符,而不会干扰您在提示符下键入的任何内容。

所述的Z shell(zsh中)具有一个内置的命令,称为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以将当前的Shell更改为/bin/zsh(需要重新登录才能使更改生效)。

  6. 运行exit,如果你想从外壳的zsh退出。

这是我的终端上的15秒截屏视频:

在命令提示符前在终端中运行时钟


4
截屏奖励积分。确实很酷的东西。
MadMike

@SauravKumar运行chsh以将默认Shell从更改/bin/bash/bin/zsh。您必须注销并再次登录。
RaduRădeanu13年

其实我做了它。但每一次终端打开我已经执行zsh命令进入到这个时钟模式..
Saurav库马尔

@RaduRădeanu:是的,在登录以及重新启动后都可以正常工作。:P
Saurav Kumar

这对我不起作用。一秒钟后,它将关闭终端。我在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文件中添加以上命令(您喜欢的命令或两者都使用)。


大!关于如何更改时钟颜色的任何线索?
微积分骑士

1
@CalculusKnight,您可以在命令中更改颜色代码。您可以参考此以获取颜色代码。misc.flogisoft.com/bash/tip_colors_and_formatting
g_p

1
这可以正常工作-非常感谢。我正在从.bashrc调用它,以阻止过于主动的防火墙杀死空闲的SSH连接。
克里吉

11

如果您只想显示时钟,请使用date

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

这将每秒显示一次时间,直到您按停止为止CtrlC。如果您希望它在同一行上(上面的代码每秒钟将打印一条新行),请执行以下操作:

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

2

这个问题困扰了我几天,这是我编辑的帖子,其中包含我所学到的所有材料。具体来说,我的目标是在BASH中的提示旁边显示时钟。就像Radu Radeanu在他的回答中提到的那样,关键是找到一个函数或变量,该函数或变量能够不断刷新命令提示符或重绘屏幕,而不会干扰屏幕或键入的内容。虽然,这可以通过while循环来实现,如G_P所示,但是使用tput函数不断刷新屏幕时,刷新时我的屏幕上的任何文本都会混乱。通过修改G_P发布的代码,我已经接近实现OP的要求,但是我仍然相信Radu的答案与OP想要的最接近。事不宜迟,这里是我的一些事情

#1,我的首选解决方案:终端多路复用器

终端多路复用器是一种软件,可以将终端屏幕分为两个或多个屏幕。我想特别注意Byobu码头。这个基于ncurses的终端仿真器,允许您显示时间,CPU百分比,内存以及其他所有指标。在我的byobu终端的屏幕截图中,您可以看到CPU温度,电池百分比,互联网连接质量,CPU频率,RAM,日期以及时间。如果您最关心的是在航站楼期间不断监控这些情况,那么Byobu是您的最佳选择。实际上,我非常喜欢它,我将其设置为在登录tty时自动加载。唯一的怪癖是,在tty中,您实际上无法合并单独的窗口-只能在使用F3和F4键的选项卡之间切换。

我的byobu终端的屏幕截图

涉及复用窗口的另一种解决方案是使用splitvt,将屏幕分为两部分。您可以运行终端时钟,例如tty-clock,使用带日期的watch命令,也可以使用脚本自己编写一个。以后再说。在屏幕截图中,您可以在顶部看到带有普通bash提示的拆分的一部分,而在下方的屏幕中,您可以看到正在运行的脚本,该脚本不断地dateclearcommand 刷新command的输出。

在此处输入图片说明

#2,虽然Do Loop和tput 这可能是与提出问题的人想要用bash实现的最接近的地方。

G_P发布了一个很好的解决方案,涉及while doand tput命令。但是在G_P的代码中,有两件事我不喜欢。第一,时钟在提示的右边,第二,因为睡眠周期是1秒(请参阅原始代码,其中显示了睡眠),所以屏幕每秒钟重绘一次,这弄乱了我的输出。我所做的是用\ n运算符将bash提示符编辑为低1行,并更改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将时钟放置在屏幕的右上角,在提示的正上方,sleep 60将睡眠周期更改为60秒,因为这样一来,我只能监视小时和分钟,而不是每秒。这样,无论我在屏幕上显示的任何文本在很大程度上都不会受到影响(仅当我碰巧在同一时间刷新时钟运行命令时)。

在此处输入图片说明

PS1行已经在您的.bashrc配置文件中,因此您只需对其稍作调整即可。while do循环应添加到同一文件中的某个位置,最好以#注释结尾,这是您最初添加的内容。而且,别忘了总是像这样备份任何文件,以防万一您制作bubu并需要回到原来的状态。

#3,脚本编写及其他

这部分仅适用于想看时间的人。对于那些想要不断监视它的人,#1和#2是首选。

因此,正如我们已经看到的,while循环非常有用。这是您可以使用while do loop,date和sleep命令创建时钟的方法。

在此处输入图片说明

按回车/回车键,您基本上会在清除的屏幕上每秒看到日期命令的输出。如果您不想每次都输入所有内容,请将所有这些内容转换为脚本:

#!/bin/bash

while true
do
clear;date
sleep 1
done

现在,您可以在一个bash实例中使用splitvt运行该脚本,而在另一个实例中运行。

另一个解决方案是watch -n1 date命令,它将以1秒钟的时间连续执行日期命令。

结束语:在尝试找到该问题的答案时,我学到了一些东西,希望我的发现对您有所帮助,并且希望我能够为这个问题做出贡献。Byobu终端恕我直言是最好的解决方案,但请您自己决定,进行一些研究并选择最适合您的方法。

我在研究时发现的一些东西:

我的原始帖子,简约解决方案:编辑〜/ .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小时制显示运行时间。有关更多信息,请查看this。另外要注意的一点是,我在使用其他内容,因为我没有使用彩色提示。

PS:请让我知道我是否应该在答案中添加任何内容或以任何方式对其进行编辑,但是在大多数情况下,我认为这是我可以想出的最确定的答案,至少我个人不会添加任何内容新的。


1
这不会显示OP想要的“运行中”时钟。它只会将时间添加到终端提示中。
2014年

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
我很欣赏你的时间和精力,但是这不是我想要的..
Saurav库马尔

@SauravKumar是的,我知道您想要一个运行的时钟。我不确定'PS1'变量$PROMPT_COMMAND是否可行,如果您可以找到显示滴答时间的命令,则可能会起作用。
kiri

那么我认为你可以做到这一点.. :)看来你已经接近达成解决方案..
Saurav库马尔

为什么它包含\ u两次?@SauravKumar
David

@David:对不起,我不知道。但是@ minerz029可能会回答您的问题。:)
Saurav Kumar 2014年

1

我非常喜欢由-key触发的ncmpcpp时钟功能0(请参见屏幕截图)。有关安装过程的更多详细信息,请参阅此文章

在此处输入图片说明


1
watch -t -n1 "date +%T|figlet" 将是一个简单的方法。
g_p 2014年

1

g_pSerg的影响,我尝试在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显示了正在使用的命令:

时间终端提示.gif

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.