トップ «前の日記(2008-01-06) 最新 次の日記(2008-01-12)» 編集

ORCA愉快日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|10|11|12|
2012|01|02|09|
2013|04|

2008-01-09 進捗状況を表す"グルグル"をシェルスクリプトで書いてみた

_ [Linux] 進捗状況を表す"グルグル"をシェルスクリプトで書いてみた

進捗状況を表す"グルグル"を書いてみましたよ。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などを確認のこと。

トップ «前の日記(2008-01-06) 最新 次の日記(2008-01-12)» 編集