在终端上显示时间

发布时间 2023-06-12 15:20:11作者: 叕叒双又

 原文链接:https://kodango.com/put-a-console-clock-in-top-right-corner

  在终端上显示时间:Put a console clock in top right corner。文中给出了两种方法,一种是利用ANSI Escape Sequences,另外一种是通过tput这个命令。

第一种方法

命令如下:

while true; do echo -ne "\e[s\e[0;$((COLUMNS-27))H$(date)\e[u"; sleep 1; done &

效果图见:

命令解释:

1.首先这串命令是包含在while循环中的,每隔1秒更新一次;

while true; do cmd; sleep 1; done &

2.echo选项解释,-e的意思是可以显示转义序列,而-n是指不打印回车;

3.\e[s\e[0;$((COLUMNS-27))H$(date)\e[u是这里的重点,下面是说明:

$(date)是打印当前时间,也是这里显示的内容,其余的就是上面说说的ANSI Escape Sequences;其中,"\e[s"的意思是指保存当前光标位置;"\e[0;$((COLUMNS-27))H"是指迁移光标到指定的坐标(0, $((COLUMNS-27))),这里$COLUMNS保存的是当前终端窗口的列数;"\e[u"与"\e[s"是相对的,表示恢复之前保存的光标位置。

第二种方法

命令如下:

while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done &

命令效果同上,这里主要利用tput这个命令来替换上面的ANSI Escape Sequences,步骤都是差不多的:
1. 首先保存当前光标位置(save cursor):tput sc;
2. 获取当前终端窗口的列数:tput cols;
3. 设定光标要移动到目标位置:tput cup 0 $(($(tput cols)-29));
4. 最后恢复上次保存的光标位置(restore cursor):tput rc;

是不是觉得用tputc更加清爽,可读性更加,而且tput命令的功能不仅限与此,它还可以做更多终端的操作,比如设置文本的颜色、粗体等等,具体可以看它的man手册,而tput可以设置的属性可以参考man terminfo。当然,网上应该也有一些不错的参考文章,这里推荐一篇IBM上的tput入门

这种做法可以推广,你可以选择自己想显示的内容,比如当前系统的一些负载状况:

while true; do tput sc; tput cup 0 $(($(tput cols)-74)); awk '{print $1,$2,$3}' /proc/loadavg; tput rc; sleep 10; done &