おれのIT日記

2023/03/16 (木)

Linux

crontab -eがエラーを返して終わってくれない ~ bad minute ほか


$ crontab -e
を終了するとき、
"/tmp/crontab.XXXXfQbyGc":1: bad minute
errors in crontab file, can't install.
Do you want to retry the same edit?
というようなことを聞いてくる。

ちなみにviで行数を見るには
:set number
だ。

空行を消すと、エラー行が変わるので、一生懸命消すのだが、どうもそういうことではないらしい。すべての空行を削除したのに、エラーが取り切れない。

ようやく分かったのだが...
わたしは、crontabの内容を、複数マシンで共用するため、テキストファイルから
/var/spool/cron/crontab/hotsuma
へ上書していたのだが、この時、途中にWindows機を経由したからだろうか、改行コードがおかしくなっていたようである。

どうおかしくなっているかというと、0a0d(0d0aに非ず!)という改行コードが仕込まれていたようなのである。
このような改行は普通はないし、どういう原因でこうなったのか、分からないのであるが...
もし0d0aになっていると、viで編集したときに^Mという表示がされるので、視覚的に一発でわかる。
一方、0a0dというのは、普通、改行コードとして認知されていないと思う。0d単体は改行だし0a単体も勿論改行なのだが、この順序で2つが並んでいる場合というのは、viの編集画面上は、特に表示がされずわからないのである。
私の個人的な感覚では、これは二つの改行と扱ってほしい感じがする。
各行に必ず空行が続くので一発で気づいたと思うが、画面上、改行は一回しかされない。表示さえされれば、余計な0dを削除できるんだが、表示されず、編集不能なのだ。
ということは、0a0dはセットで、一つの改行、とviに認識されているのだろうか??
あるいは先に見つかった0aをもとに、viは「このテキストファイルの改行コードは0aだもん。0dは無視するもん」…とでも思っているのであろうか?
とにかくviでは、この0a0dというコードが、一見、正しい改行コードとして扱われているように「見えちゃう」のである。

しかしながらviがどう解釈しどう表示するかとは全く無関係に、crontabにとってはこれは不正な文字である。

エディタ画面で見えないものをどうやって見つけたかというと、crontabの元テキストを、hexdumpして見つけた。
「改行コードが0d0aになっているわけではない」とわかっていたので、「改行コードには問題ない」と思いこんでしまい、、見つけるのに時間を要してしまった。まさか0a0dとはねぇ。

直し方はいろいろあると思うのだが、わたしはnkfで行った。

nkf -Lu xxxxxx > xxxxxxx2
あるいは
nkf --overwrite -Lu xxxxxxx

これで、二つの改行ではなく、0a0dのペアが0aに置き換わる。
ということは…nkfも、0a0dはひとつの改行と認識している、ということなのか。私が知らないだけで、0a0dは有効な改行コードなのか。

関係ないが、無意識にnkf --override、と誤って打ってしまって「?」とハマった。
このときnkfは何も言ってくれないのである。黙って、変換結果を画面に流す。
unknown option、ぐらいの表示、してくれればいいのにねぇ。