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

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

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

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

saurav@saurav-P4I45Gx-PE:~$

然后我希望看到时钟(时间)如下:

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

或者

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

或任何其他格式。06:27:01时间在哪里。我想要的只是显示随着时间流逝而变化的时间。

那么有什么方法可以实现这个吗?

答案1

我不确定使用默认的 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 shell,请运行。

以下是我的终端的 15 秒截屏:

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

答案2

如果您想在终端中显示运行时间,可以使用此命令。它将在终端的右上方显示时间。

  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文件中添加上述命令(您喜欢的命令或两者)。

答案3

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

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

这将每秒显示一次时间,直到您使用 停止它CtrlC。如果您希望它在同一行上(上面的命令将每秒打印一个新行),请执行以下操作:

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

答案4

这个问题困扰了我好几天,下面是我编辑的帖子,包含了我学到的所有材料。具体来说,我的目标是实现在 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 提示符,在下面的部分中,您可以看到正在运行的脚本,它只是不断date使用命令刷新命令的输出clear

在此处输入图片描述

#2、While Do 循环并输入 这可能与提问者想要用 bash 实现的功能最接近。

G_P 发布了一个很好的解决方案,其中涉及while dotput命令。然而,G_P 的代码中有两点我不喜欢。第一,时钟位于提示符的右侧;第二,由于睡眠周期为 1 秒(请参阅原始代码中提到睡眠的地方),屏幕每秒都会重新绘制一次,这会弄乱我的输出。我所做的是,使用 \n 运算符将我的 bash 提示符编辑为低一行,并更改 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 do loop 非常有用。下面介绍如何使用 while do loop、date 和 sleep 命令创建时钟。

在此处输入图片描述

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

#!/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 小时格式显示运行时间。有关更多信息,请查看. 另外请注意,我使用 else 之后的东西,因为我没有使用彩色提示。

附言:如果我应该在我的答案中添加任何内容或以任何方式编辑它,请告诉我,但在大多数情况下,我相信这是我能想到的最具结论性的答案,至少我个人不会添加任何新内容。

相关内容