読者です 読者をやめる 読者になる 読者になる

すがブロ

sugamasaoのhatenablogだよ

劣化版 tail コマンドを作ってみた

プログラム Ruby

追記(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:自分の自作ツールで仕事するとかやってみたいお年頃