EDITOR = vi crontab -eを使用して存在しない文字列を検索しようとしたときにエラーが発生しました。

EDITOR = vi crontab -eを使用して存在しない文字列を検索しようとしたときにエラーが発生しました。

詳細

OS:Solaris 10、アップデート11
ハードウェア:M5-32 LDOM、V490、IBM x3650、T5240、VMware仮想マシンなど...
EDITOR=vi
用語=vt100
tmpディレクトリ=/var/tmp
cron shell=/sbin/sh
私のシェル=/bin/bash

質問

crontabを修正しようとすると非常に興味深いエラーが発生しますcrontab -e

viをエディタとして使用して、存在しない文字列を検索してcrontab -e構文を検証して確認し、保存しようとすると、変更がなくてもエラーが発生したというメッセージが表示されます。

はい

admin@server# export EDITOR=vi
admin@server# crontab -e

コマンドモードでは、「foobar123」など、存在しない文字列を検索します。 「パターンが見つかりません」というメッセージが表示されたら、これを試してみると:wq...

The editor indicates that an error occurred while you were
    editing the crontab data - usually a minor typing error.

    Edit again, to ensure crontab information is intact (y/n)?
    ('n' will discard edits.)

明らかに、すぐに戻って保存を選択した場合、エラーは発生しません。これは、VMwareからM5-32 LDOM、V490物理システムまで、あらゆる種類のSolarisで繰り返すことができます。 cronが存在しない文字列検索をエラーとして解釈しますがvisudo

関連するメモでは、Solaris 11 はこのエラーを生成しません。これが一種のPOSIX仕様であれば、なぜ11ではなくSolaris 10に適用されますか?

答え1

Solaris 10またはSolaris 11用のソースコードがないと確かに言うことはできませんが、疑わしいです。トーマス・ディッキーvimを発見したことによると、彼は正しい道を進んでいます。

私は追跡したIllumOSソースの一つex / viディレクトリでerrcntを検索してください。errcntが増加のみを示します。errcnt は main() の戻りコードとして使用されます。

したがって、viでerrcntを増やすことができない場合、crontabコマンドに「バブルアップ」されます。crontab用のIllumOSソース0以外の値では満足できないことを示します。

crontab.cのコメントも参考にしてください!

311             ret = system(buf);
...
327             if ((ret) && (errno != EINTR)) {
328                 /*
329                  * Some editors (like 'vi') can return
330                  * a non-zero exit status even though
331                  * everything is okay. Need to check.
332                  */

答え2

オペレーティングシステム:Solaris 10、アップデート11ハードウェア:LDOM、VMware仮想マシンなど... EDITOR = vi用語= vt100

viとcrontabの動作についての私の観察は上記と似ています。 Crontab -eは、「crontabデータの編集中にエラーが発生したことをエディタに表示します...」エラーが発生します。

編集を続けたり…変更をキャンセルする以外に、選択肢はありません。 viエディタを使用してファイルを変更して保存しようとすると、変更のみがキャンセルされます。私はviがcrontabの行動についても責任があると思います。現在、viが編集されたファイルへの変更を保存できるように終了ステータスが0の状態で終了するように強制するvi用のラッパースクリプトがあります。 crontabコンテンツをファイルにリダイレクトし、そのファイルの変更を編集してからcrontabにリダイレクトします。少し痛くて迷惑ですが、Solaris 11.NKに達するまで機能します。

関連情報