Bagaimana cara mengedit file crontab dengan Vim (saya mendapatkan kesalahan: 'file temp harus diedit di tempat')

12

Bagaimana cara saya mengedit crontabfile di 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

Menggunakan EDITOR=nviberfungsi dengan baik ... Linux juga tampaknya berfungsi dengan baik ...

Martin Tournoij
sumber

Jawaban:

19

Masalahnya adalah bagaimana Vim menulis file. Secara default, ini membuat salinan file dan menimpa yang asli.

Anda dapat mengamati ini dengan:

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

# Open file in Vim, :wq

# inode changed!
$ ls -i a
3155322 a

crontabbingung dengan ini (lihat :help crontab)

Anda perlu menggunakan :set backupcopyuntuk yesmembuat Vim menimpa file asli:

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

Anda dapat melakukan ini secara otomatis untuk file crontab dengan:

au FileType crontab setlocal bkc=yes
Martin Tournoij
sumber
2

@Jawaban Martin benar. Variasi meskipun, untuk orang-orang seperti saya yang mencoba membatasi mengisi vimrcfile mereka dengan pengecualian sesekali - di sini mengedit crontab, adalah dengan menggunakan modeline. Ini memungkinkan untuk menempatkan pengecualian langsung di file target.

Di bawah ini adalah modeline crontab saya:

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

Bit penting di sini adalah bkc=yesyang cocok dengan vimrckonfigurasi @ Martin . Sisanya adalah pengaturan kenyamanan pribadi.

Ini mengatakan untuk kelengkapan dan makanan untuk dipikirkan, jawaban awal @ Martin adalah yang paling memadai di sebagian besar kasus.

JM. Marcastel
sumber
1

Bukan kesalahan yang sama tetapi juga cukup sering terjadi:

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

Kesalahan ini akan muncul, jika Anda menggunakan vibukan vimuntuk crontab. Anda perlu mengatur editor crontab dengan menambahkan kode berikut di ~/.bashrcfile Anda :

export EDITOR=vim
rubo77
sumber
-1

Hal yang sama terjadi pada OSX. Setelah menyelidiki masalah, saya menemukan ini berfungsi dengan baik vi, tetapi tidak berhasil vim.

Jadi perbaikannya bisa:

EDITOR=vi crontab -e

Namun vibiasanya terhubung ke vim(misalnya pada OSX) jadi itu adalah hal yang sama.


Ini dapat diselesaikan dengan baris berikut di file vimrc Anda :

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

Ada solusi lain untuk ini dengan menambahkan baris berikut ke file .vimrc :

if $VIM_NOBACKUP
  set nobackup
  set nowritebackup
endif

dan jalankan perintah:

VIM_NOBACKUP=1 crontab -e

Anda juga dapat mencoba mendefinisikan variabel berikut:

EDITOR='VIM_NOBACKUP=1 vim'

Sumber: crontab: file temp harus diedit di tempat


Alasan mengapa hal ini terjadi berkaitan dengan cara vim/ vimemperlakukan file cadangan.

kenorb
sumber
1
Sejak crontabbiasanya mengangkat nilai EDITORatau VISUAL(jika didefinisikan), Anda dapat mengatur mereka: EDITOR='VIM_NOBACKUP=1 vim'.
muru
@uru saya sudah mencoba, tapi saya rasa itu tidak berhasil. crontab -emenghasilkan crontab: VIM_NOBACKUP=1 vim: No such file or directory.
kenorb
1
Pasti OSX, karena berfungsi di Arch Linux dan Ubuntu, bash dan zsh.
muru
2
Semua mucking tentang variabel lingkungan tampak konyol bagi saya; Vim memiliki cara untuk menangani pengaturan khusus file, dan itu disebut autocmds. Sepertinya Anda baru saja menyalin ini dari tautan, tetapi tampaknya penulisnya tidak terlalu mengenal Vim.
Martin Tournoij
2
Mengapa memasukkannya? Ini cara konyol dalam melakukan sesuatu, dan hampir tidak pernah ada alasan untuk tidak menggunakan autocmd. Ketika kami menghapus itu, kami hanya memiliki autocmd, yang merupakan jawaban yang sama yang telah ada di sini selama lebih dari satu setengah bulan. Jawaban ini tidak menambahkan apa pun selain kebisingan.
Martin Tournoij