使用例
spinner proccessing... & pid=$!
sleep 5
kill $pid
wait $pid 2>/dev/null
printf "%s%s\n" "$ERASE_LINE" 'Done!!'
関数
Bash
ESC=$(printf '\033')
CSI="${ESC}["
RESET="${CSI}0m"
GREEN="${CSI}32m"
ERASE_LINE="${CSI}2K"
HIDE_CURSOR="${CSI}?25l"
function spinner() {
local i=0
local spin='⠧⠏⠛⠹⠼⠶'
local n=${#spin}
while true; do
sleep 0.1
printf "%s%s" "${ERASE_LINE}"
printf "%s %s" "${GREEN}${spin:i++%n:1}${RESET}" "$*"
printf "%s\r" "${HIDE_CURSOR}"
done
}
説明
-
n=${#spin}
:spin
という変数の文字列の長さを取得しています -
printf
: ここではecho -en
と同等。エスケープシーケンスを解釈して最後に改行はしない -
${<文字列>:n:m}
: 文字列のn文字目からm文字分の長さの部分文字列 (※ Bash依存) -
i++%n
: iの数値をnで割ったあまりを返してiに1を加えます -
$*
: spinner関数に渡された引数を全て出力します -
\r
: キャリッジリターン。カーソル位置を行頭に戻します - 最初のCSIについては参考記事を参照されたい12
zsh
ESC=$(printf '\033')
CSI="${ESC}["
RESET="${CSI}0m"
GREEN="${CSI}32m"
ERASE_LINE="${CSI}2K"
HIDE_CURSOR="${CSI}?25l"
function spinner() {
local idx
local spin='⠧⠏⠛⠹⠼⠶'
local n=${#spin}
while true; do
sleep 0.1
printf "%s" "$ERASE_LINE"
printf "%s %s" "${GREEN}${spin[idx++ % n + 1]}${RESET}" "$*"
printf "%s\r" "$HIDE_CURSOR"
done
}
参考
- command line - How to create a rotation animation using shell script? - Ask Ubuntu
- BashFAQ/034 - Greg's Wiki