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에 도달할 때까지는 작동합니다.

관련 정보