ฉันจะแก้ไขไฟล์ crontab ด้วย Vim ได้อย่างไร (ฉันได้รับข้อผิดพลาด: 'ต้องแก้ไขไฟล์ temp')


12

ฉันจะแก้ไขcrontabไฟล์ใน FreeBSD ได้อย่างไร

$ crontab -e
# ... I do my thing in vim & :wq

"crontab.9ZcXiFaawt" 6L, 203C written
crontab: temp file must be edited in place
Exit 1

ใช้EDITOR=nviงานได้ดี ... Linux ดูเหมือนว่าจะทำงานได้ดี ...

คำตอบ:


19

ปัญหาคือวิธีที่ Vim เขียนไฟล์ โดยค่าเริ่มต้นมันจะทำสำเนาของไฟล์และเขียนทับไฟล์ต้นฉบับ

คุณสามารถสังเกตสิ่งนี้ด้วย:

# Show the file's inode
$ ls -i a
3156153 a

# Open file in Vim, :wq

# inode changed!
$ ls -i a
3155322 a

crontabสับสนโดยสิ่งนี้ (ดู:help crontab)

คุณต้องใช้:set backupcopyเพื่อyesทำให้ Vim เขียนทับไฟล์ต้นฉบับ:

"yes"   make a copy of the file and overwrite the original one

คุณสามารถทำได้โดยอัตโนมัติสำหรับไฟล์ crontab ด้วย:

au FileType crontab setlocal bkc=yes

2

@ Martin ตอบเองถูกต้อง อย่างไรก็ตามรูปแบบสำหรับคนอย่างฉันที่พยายาม จำกัด การเติมvimrcไฟล์ด้วยข้อยกเว้นเป็นครั้งคราว - นี่คือการแก้ไข crontab คือใช้ modelines สิ่งนี้อนุญาตให้วางข้อยกเว้นโดยตรงในไฟล์เป้าหมาย

ด้านล่างเป็นโมเดล crontab ของฉัน:

# vim: nu et tw=130 ts=8 sts=4 sw=4 ff=unix fo-=l fo+=tcroq2 bkc=yes

บิตสำคัญที่นี่คือสิ่งbkc=yesที่ตรงกับการvimrcกำหนดค่าของ @ Martin ส่วนที่เหลือเป็นการตั้งค่าความสะดวกสบายส่วนบุคคล

นี่เป็นการพูดเพื่อความสมบูรณ์และอาหารสำหรับความคิดคำตอบเบื้องต้นของ @ Martin นั้นเพียงพอที่สุดในกรณีส่วนใหญ่


1

ไม่ใช่ข้อผิดพลาดเดียวกัน แต่เกิดขึ้นค่อนข้างบ่อย:

Error detected while processing /root/.vimrc:
line    2:
E319: Sorry, the command is not available in this version: syntax enable
line    7:
...

ข้อผิดพลาดนี้จะปรากฏขึ้นหากคุณใช้viแทนvimcrontab คุณต้องตั้งค่าเครื่องมือแก้ไขของ crontab โดยเพิ่มรหัสต่อไปนี้ใน~/.bashrcไฟล์ของคุณ:

export EDITOR=vim

-1

สิ่งเดียวกันนี้เกิดขึ้นบน OSX หลังจากตรวจสอบปัญหาฉันพบว่าใช้งานได้กับธรรมดาviแต่ไม่สามารถใช้งานvimได้

ดังนั้นการแก้ไขอาจเป็น:

EDITOR=vi crontab -e

อย่างไรก็ตามviมักจะเชื่อมโยงกับvim(เช่นบน OSX) ดังนั้นมันจึงเป็นสิ่งเดียวกัน


สิ่งนี้สามารถแก้ไขได้โดยบรรทัดต่อไปนี้ในไฟล์vimrcของคุณ:

au BufNewFile,BufRead crontab.* set nobackup | set nowritebackup

มีวิธีแก้ไขอื่นสำหรับสิ่งนี้โดยเพิ่มบรรทัดต่อไปนี้ในไฟล์. vimrc :

if $VIM_NOBACKUP
  set nobackup
  set nowritebackup
endif

และเรียกใช้คำสั่ง:

VIM_NOBACKUP=1 crontab -e

คุณอาจลองกำหนดตัวแปรต่อไปนี้:

EDITOR='VIM_NOBACKUP=1 vim'

ที่มา: ไฟล์ crontab: temp จะต้องแก้ไขให้ถูกต้อง


เหตุผลที่สิ่งนี้เกิดขึ้นเกี่ยวข้องกับวิธีvim/ viปฏิบัติกับไฟล์สำรอง


1
เนื่องจากcrontabมักจะยกค่าของEDITORหรือVISUAL(ถ้ามันถูกกำหนดไว้) EDITOR='VIM_NOBACKUP=1 vim'คุณสามารถตั้งค่าให้:
muru

@muru ฉันพยายามแล้ว แต่ฉันคิดว่ามันใช้ไม่ได้ สร้างcrontab -e crontab: VIM_NOBACKUP=1 vim: No such file or directory
kenorb

1
จะต้องเป็นสิ่ง OSX เพราะทำงานบน Arch Linux และ Ubuntu, bash และ zsh
muru

2
สิ่งที่ล้อเลียนเกี่ยวกับตัวแปรสภาพแวดล้อมดูเหมือนจะโง่สำหรับฉัน Vim มีวิธีจัดการกับการตั้งค่าเฉพาะไฟล์และเรียกว่า autocmds ดูเหมือนว่าคุณเพิ่งคัดลอกสิ่งนี้จากลิงก์ แต่ดูเหมือนว่าผู้แต่งนั้นไม่คุ้นเคยกับ Vim
Martin Tournoij

2
ทำไมต้องรวมไว้ด้วย? มันเป็นวิธีที่โง่ในการทำสิ่งต่าง ๆ และแทบไม่มีเหตุผลที่จะไม่ใช้ autocmd เมื่อเราลบสิ่งนั้นออกเราจะเหลือเพียง autocmd ซึ่งเป็นคำตอบเดียวกับที่นี่มานานกว่าหนึ่งเดือนครึ่ง คำตอบนี้ไม่มีอะไรนอกจากเสียงรบกวน
Martin Tournoij
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.