シェルスクリプトでスピナー(待ち時間中を示すアニメーション)を表示する方法について説明します。


スピナーとは?

ある程度長い時間(数秒以上)かかる処理を実行したとき、「処理中ですよ」ということを示す風車のようなくるくる回るアイコンを見たことはありますか? 待ち時間にくるくる回って処理中だと示すやつを「スピナー(spinner)」と言います。 環境によっては砂時計のアイコンだったりもしますね。 スピナーの例としては CSSPINが参考になりますね。

このスピナーですが、シェルスクリプトでも実現可能です。 ときどき見かけますね、- \ | / を順番に表示してくるくる回るアニメーションを表示するやつです。

スピナーをbash scriptで実装する

シェルスクリプトを実行して、数秒間以上何も表示が出てこないと、普通は不安になります。 実は何かの処理中でも、ユーザは不安になってうっかりCtl-cで中断したりしちゃいます。それを防ぐために、ユーザに「今頑張って処理してるから!」と示すためにスピナーを使います。 bashスクリプトによるスピナーアニメーションの動作例

このスピナーをbashのスクリプトでの作り方を示します。 下記のようにechosleepを組み合わせればOKです。 このようにアスキーアートでくるくる回るアニメーションを作って、ユーザに「処理中です!」と示すと良いです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash

chars="/-\|"

while :; do
  for (( i=0; i<${#chars}; i++ )); do
    sleep 1
    echo -en "${chars:$i:1}" "\r"
  done
done

# refs.
# http://askubuntu.com/questions/623933/how-to-create-a-rotation-animation-using-shell-script

まとめ

1秒スリープしたのちアニメーションを更新する、を繰り返すスクリプトを例示しました。 数秒単位で処理時間がかかるスクリプトを作る際に、ユーザに処理中だと示すために便利なスクリプトかなと思います。 これをベースにすればいろいろ応用ができるかなと思います。 GUIを使うまでもなくアスキーアートで風車的なものは表示できますので、いろいろと活用して見ていただければなと思います。