ターミナルで現在時刻を表示し続ける方法

コマンドラインで実行するスクリプトで、同じ行に表示し続けたり上書きして表示するものがある。
例えばパッケージのインストールになどで出る進捗表示などである。同じような出力をするにはエスケープシーケンスを知っておく必要がある。ASCII コードの制御文字と呼ばれるものだ。CR, LF といった改行コードに関する以外にも様々なものがある。
echo hogehoge とやると、hogehogeが出力されて次の行にプロンプトが移る。

$ echo hogehoge
hogehoge
$

echo -e "hogehoge\c"; echo 123 と実行すると \c が指定されると行末での改行が行われなくなる*1ので、次のように続けて表示される。

$ echo -e "hogehoge\c"; echo 123
hogehoge123
$

\r はキャリッジリターン(復帰)である。これを使うとプロンプトの先頭にカーソルを動かしたことになる。
そんなわけでいきなりまとめだが同じ位置に現在時刻をたんたんと表示するスクリプトは下記のように書ける。

#!/bin/sh

while true
do
  time=`date +%H:%M:%S`
  echo -e "$time\c"
  sleep 1
  echo -e "\r\c"
done

exit 0

*1:これは echo -n オプションを使うことでも可能である。