進捗状況を表す"グルグル"を書いてみましたよ。FreeBSDとかKnoppixのハードウェア認識などで、|/-\の記号がぐるぐるまわってるアレですよ。アレ。何と呼ぶのか知りませんが、knoppixのhwsetupではstartwheelという表現で書かれてました。ともかく、IRC上でこのことがネタに登った際に、コンソール上で進捗状況を表すシェルスクリプトを書いてみたときのメモ。
□ knoppixのグルグルをシェルスクリプトで実装してみた例 具体的なスクリプトは、さらに下の方の記事を参照。 □ シェルスクリプトでの例 (単なるグルグル) 実行を止めるには、Ctrl+Cで。 ---------------------------------------- #!/bin/bash while :;do for c in \| / - \\; do echo -ne "\b$c"; sleep 0.2; done; done ---------------------------------------- これを開いて分かりやすくしたものが下記。 ---------------------------------------- #!/bin/bash while :; do for c in \| / - \\; do echo -ne "\b$c" sleep 0.2 done done ---------------------------------------- □ シェルスクリプトでの例 (ファイルを見つけるまでグルグル) 下記の内容を、hoge.shなどのファイル名で保存し $ bash hoge.sh などで実行してグルグルさせておく。別ターミナルを開き、 $touch hoge.txt などを実行してhoge.txtファイルを作成すれば、スクリプトは終了する。 ---------------------------------------- #!/bin/bash filename="hoge.txt" echo -n "Finding $filename... " until [ -f $filename ]; do for c in \| / - \\; do echo -ne "\b$c" sleep 0.2 done done echo -e "\n$filename found!" ---------------------------------------- □ Knoppixでの実装例 http://debian-knoppix.alioth.debian.org/sources/hwsetup_1.2-7.tar.gz 上記ファイル中のhwsetup.cの一部抜粋 ---------------------------------------- pid_t startwheel(void) /* Feedback while detecting hardware */ { char v[]="Autoconfiguring devices... "; char r[]="/-\\|"; char *b="\b"; pid_t pid; if((pid=fork())>0) return pid; /* return Child PID to Master process */ else if(pid==0) { int i,j; /* Allow killing of process */ signal(SIGHUP,SIG_DFL); signal(SIGINT,SIG_DFL); signal(SIGTERM,SIG_DFL); write(2,v,sizeof(v)-1); for(i=j=0;;i++,j++) { if(j%8==7) write(2,"\033[42;32m \033[0m",13); /* a green space */ write(2,&r[i%4],1); write(2,b,1); usleep(40000); } exit(0); /* Exit child process */ } return 0; } ---------------------------------------- 該当の箇所は、16行目のforループ中で、18行目で8回に1回緑の空白を出力し 19行目で|/-\の記号とバックスペースを出力し、20行目で0.04secの待ちが入っている。 □ knoppixのhwsetupをシェルスクリプトで書いてみた例 ---------------------------------------- #!/bin/bash ary=(\| / - \\) for ((i=j=0 ;; i++,j++)); do if ((j % 8 == 7)); then echo -ne "\033[42;32m \033[0m" # write green space fi echo -ne "${ary[$i % 4]}" echo -ne "\b" sleep 0.04 done ---------------------------------------- 7行目のエスケープシーケンスで色を指定している箇所を変更すると 色を変更することができる。 \033はESC(エスケープシーケンス)を表す。\x1bとしても同等の意味を持つ。 [(数字)mの箇所は、色を表す。[0mは既定値に戻す。 42は背景色を緑に、32で文字色を緑にする。 42;32の箇所を変更。 黒 40,30 赤 41,31 緑 42,32 黄 43,33 青 44,34 紫 45,35 水色 46,36 灰色 47,37 エスケープシーケンスについて http://hp.vector.co.jp/authors/VA016670/escape_code.html 5. ANSI エスケープシーケンス: 色とカーソル操作 http://archive.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO-5.html 詳細は、man asciiやman bashなどを確認のこと。