Mac/OSX のテキストエディタ(TextEdit.app) の場合には EOL で終わらないテキストファイルを作成できる。フリーのテキストエディタ mi もそうである。従って OSX ではテキストファイルをアプリケーションが読み取る時に、この問題に注意しないとバグることになる。(大抵のプログラムの教科書に書かれている、1行づつテキストを読み取って処理するプログラムは endless loop にハマる)
またファイルの最後に1行を追加するのに
echo '.....' >> fooのような書き方もバグる。
さて僕が古典的な問題を採り上げたのは、僕がこの年の秋学期からの ubuntu を使った実習環境を整備する時に、あるファイル(foo とせよ)の最後に一行を追加する必要があった。そのファイル(foo)の末尾が EOL で終わっている事の確信がない。台数が多いので、環境の設定はシェルスクリプトを使う事になる。そこで foo の末尾が EOL で終わっていない場合に、まず
echo >> fooによって EOL を末尾に付加した後に
cat bar >> fooのような処理を行う必要がある。bar は追加する1行だけからなるファイルである。
foo の末尾が EOL で終わっているか、いないかをどのように判定したらよいだろうか? これはちょっとしたパズルである。いろいろ考えたあげくに、僕が採用したのは
a1=`wc -l < foo` a2=`grep '^' < foo | wc -l` if [ $a1 != $a2 ]; then echo >> foo fi cat bar >> fooである。(多分、これでうまくいくでしょう)
ubuntu の gedit は機械的に EOL を追加している。テキストの末尾が既に EOL で終わっていてもだ!
従って由緒正しくテキストを作ると、ファイルの末尾に EOL が2つも付く!