UNIXの行の定義とviの改行コード

今日、Yuriko.netの管理人さんでKtai Styleの開発者のゆりこさんからコメントやTwitterでTotal Hacksについて不具合をいくつかご指摘いただきました。

1行ずつ追っかけていただいたらしく、グサっと刺さる部分もありましたが(笑)本当にありがたい事です。

指摘していただいた内容については勉強不足も大いにあって、もう本当にごめんなさいで、今週中にはアップデートします。

ファイルの最終行に改行ですと?

ゆりこさんから指摘いただいた不具合の中で衝撃的だったのがこれ。

なぬ?

いままで不具合の報告もなかったので疑問に思って調べてみました。

実はここまでで、いちどゆりこさんには「改行ないっすよ」と回答したんですが。ふたたび「あるよ」と。

なんですと?

一瞬、頭がフリーズしかけたんですが、ふっと思い立ってテキストエディターで開いてみると、あるではないですか改行が!

あちゃーっ、改行コードがCRなんだね、そうなんだねと思って調べたらそうでもなさそう。

  • 改行コードはちゃんとLF。老眼のせいかもと思って(笑)をかもとさんにも見てもらった。
  • vimの設定も ff=unix になってる。

うーーーーん。

ちょっとしつこく調べてみました。

結論から言うと正確なソースが見つからなくて詳しいことははっきりしないのですが、以下のような感じみたいです。

  • POSIXでは「Unix においてテキストファイルとは行の集合であり、行とは改行文字で終わるものと定義される」と定義されている。
  • viのような由緒正しきテキストエディターは、この定義を忠実に守っており、行末には必ず改行が入る仕様になっている。

参考

対策方法

twitterでこの件に関してゴチャゴチャ言っていると天の声が飛んできました。

もしくは、以下のような方法もありですね。

でも個人的にはやっぱ不思議

結果オーライ(?)でこれらの方法で問題は解消するのですが、個人的には以下のような疑問を感じます。

  • POSIXで行と改行は常にセットであるべしと定義されているのなら、PHPのパーサーはこれをどう解釈してるの? (実際に動作確認をすると最後のLFを無視してるような気がするし、いままで気がつかなかったし。)
  • vimをバイナリーモードで起動することで何か問題がありそうで気持ち悪い。

というわけで、詳しい人、どなたか解説して下さい。