![如何在命令提示符之前在终端中显示正在运行的时钟](https://linux22.com/image/1117063/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%91%BD%E4%BB%A4%E6%8F%90%E7%A4%BA%E7%AC%A6%E4%B9%8B%E5%89%8D%E5%9C%A8%E7%BB%88%E7%AB%AF%E4%B8%AD%E6%98%BE%E7%A4%BA%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E6%97%B6%E9%92%9F.png)
我更喜欢使用终端,并且大部分时间都在使用它。我正在寻找一种在并行使用终端时查看时间的方法。时间过后会自动更改。如果它能在我的命令提示符左侧显示,那就太棒了。
如果这是我的终端中的命令提示符:
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
参数一起使用时,强制重新扩展提示,然后重新显示编辑缓冲区。
如果您想尝试,请按照以下步骤操作:
使用以下命令安装 Z shell:
sudo apt-get install zsh
zsh
第一次运行时,请选择0
您被要求的时间。编辑
~/.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 }
保存文件并关闭。
在终端中,当您仍在使用 zsh 时,运行
source ~/.zshrc
或简单地zsh
来重置提示。现在您的提示应如下所示:saurav@saurav-P4I45Gx-PE[1:25:21]:~$
带有一些颜色。
如果您喜欢它,请运行
chsh -s /bin/zsh
将您当前的 shell 更改为/bin/zsh
(需要重新登录才能使此更改生效)。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 键在选项卡之间切换。
涉及多路复用窗口的替代解决方案是使用splitvt
,它将屏幕分成两部分。您可以运行终端时钟(例如)tty-clock
,使用带有日期的 watch 命令,或者您可以使用脚本自己编写一个。稍后会详细介绍。在屏幕截图中,您可以看到分割的一部分,顶部是正常的 bash 提示符,在下面的部分中,您可以看到正在运行的脚本,它只是不断date
使用命令刷新命令的输出clear
。
#2、While Do 循环并输入 这可能与提问者想要用 bash 实现的功能最接近。
G_P 发布了一个很好的解决方案,其中涉及while do
和tput
命令。然而,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 之后的东西,因为我没有使用彩色提示。
附言:如果我应该在我的答案中添加任何内容或以任何方式编辑它,请告诉我,但在大多数情况下,我相信这是我能想到的最具结论性的答案,至少我个人不会添加任何新内容。