前两天,在知乎的一个问答中(上Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?),看到有人在回复中推荐commandlinefu.com这个网站,回头就收藏了,这个网站是介绍一些常用或者很技巧的一些命令:

commandlinefu.com is the place to record those command-line gems that you return to again and again.

Delete that bloated snippets file you've been using and share your personal repository with the world. That way others can gain from your CLI wisdom and you from theirs too. All commands can be commented on, discussed and voted up or down.

今天在上面看到一篇很有意思的文章,介绍了如何在终端上显示时间: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 &