cdif / sdif / watchdiff now runs on Linux

OS X でしか使っていなかったのですが、Linux で実行してみたら使えなかったので修正しました。

  • 端末の幅を取得するのに stty を使っていたが、仕様の違いがあるので tput を使うように変更
  • Text::Glob は標準モジュールだと思っていたが違ったので使わないように変更

また、一時ファイルの取り扱いが変わっています。

  • 従来は /tmp にファイルを作成して使用後に削除していた
  • それを IO::File::new_tmpfile を使うように変更
    • これだとファイルをオープンすると同時に unlink するので削除する必要がない
    • そのため異常終了してもファイルが残らない
  • diff コマンドに与えるパスは /dev/fd/ を使うように変更

追記

会社の FreeBSD で試してみると /dev/fd/3, /dev/fd/4 が開けないといいますね。 CLOSE ON EXEC の解除ができていないのでは疑ったのですが、そうではなくてファイルシステムの問題のようです。 マニュアルを見ると devfs(5) は 0, 1, 2 しか提供しないので、fdescfs(5) を使えと書いてあります。 こういう場合は設定を変えてくださいという方針でいいんでしょうかね。

追記2

sdif, cdif, watchdiff を統合して sdif-tools というリポジトリで管理するようになっています。

CPAN にもリリースしたので、cpanminus でインストールできます。

$ cpanm App::sdif