Command-Line

使用 EDITOR=vi crontab -e 搜尋不存在的字元串時出錯

  • February 25, 2017

細節

OS: Solaris 10 , update 11

HW: M5-32 LDOM, V490, IBM x3650, T5240, VMware 虛擬機等…

EDITOR=vi

term=vt100

tmp directory=/var/tmp

cron shell=/sbin/sh

My外殼=/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 規範,為什麼它適用於 Solaris 10 而不是 11?

沒有 Solaris 10 或 Solaris 11 的原始碼,我不能肯定地說,但我懷疑Thomas Dickey是在正確的軌道上,基於他對 vim 的發現。

我追踪了IllumOS 原始碼,其中在 ex/vi 目錄中搜尋 errcnt顯示 errcnt 只會遞增,並且errcnt 用作 main() 的返回碼

因此,在 vi 中增加 errcnt 的任何故障都將“冒泡”到 crontab 命令,其中 crontab 的IllumOS 源表明它會對除零以外的任何內容不滿意。

還要注意 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                  */

引用自:https://unix.stackexchange.com/questions/326633