使用 EDITOR=vi crontab -e 搜尋不存在的字元串時出錯
細節
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 */