劣化版 tail コマンドを作ってみた
追記(2007/4/25)
改良版はこっち:id:seiunsky:20070424:1177429928
tail -f 大好きっ子
仕事柄、 tail -f でログを追うのが日常とかしているので良く使うコマンドとしては上位に上がる。
で、ふと
簡単に実装できるんじゃね? と思ったことと、あわよくば Windows に移植して仕事で使えるんじゃね?*1とか思ったので、やってみた。
基本的には
ちょっと Web を漁ってみたところ、ファイルを一行ずつ読み込み&出力で次の一行が無ければ sleep で待てば良さそう。
書いてみると簡単そうだけど、実際にもすぐに実装できた。
一番ハマった(そして諦めた)のは
プログラムを終了するために Ctrl-C でシグナルを受け取ったら、プログラムを終了させようとしたんだけど、これがなかなかできなかった。
いやね、Ctrl-C でシグナルを受け取ってそのシグナル(INT)のシグナルハンドラを trap して終了ってのはできたんだが、終わるときに開いているファイルをクローズさせるのがうまくいかなかったんだ。
妥協の結果
ファイルの入力待ちのループ処理をまるっと begin 〜 end で括って、例外が発生したら ensure でファイルをクローズする処理を入れた。
もう、ホントに妥協の代物でしかないんだけど、他にうまいやり方が思いつかなかった。。。
こうすればいいんじゃね? ってアイデアがあるスーパープログラマーな人がいたら教えてください。
#!/usr/bin/ruby def usage puts "wrong arguments..." puts "ex) %rtail filename" end if ARGV[0].nil? usage exit 1 else file = File.open(ARGV[0], "r") end begin while (true) do line = file.gets unless line.nil? print $_ else sleep 1 end end ensure file.close unless file.closed? exit 0 end
改めてみても微妙な香りのするソースだな(´Д`)
*1:自分の自作ツールで仕事するとかやってみたいお年頃