Як редагувати файли crontab за допомогою Vim (я отримую помилку: 'тимчасовий файл повинен бути відредагований на місці')


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

@ Самовідповідь Мартіна правильна. Однак для людей, таких як я, які намагаються обмежити заповнення свого vimrcфайлу випадковими винятками - тут редагування кронтабуля використовується можливість використання моделей. Це дозволяє розміщувати винятки безпосередньо в цільовому файлі.

Нижче розміщений мій модельний кронтаб:

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

Важливим бітом тут є те, bkc=yesщо відповідає vimrcконфігурації @ Мартіна . Решта - це особисті налаштування зручності.

Це говорить про повноту та їжу для роздумів, початкова відповідь @ Мартіна є найбільш адекватною у більшості випадків.


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: тимчасовий файл потрібно редагувати на місці


Причина, що це відбувається, пов'язана з тим, як vim/ viобробляє файли резервного копіювання.


1
Оскільки , як crontabправило , піднімає значення EDITORабо VISUAL(якщо вона визначена), ви можете встановити їх: EDITOR='VIM_NOBACKUP=1 vim'.
муру

@muru Я намагався, але не думаю, що це працює. crontab -eпороджує crontab: VIM_NOBACKUP=1 vim: No such file or directory.
kenorb

1
Це повинно бути справою з OSX, оскільки вона працює на Arch Linux та Ubuntu, bash та zsh.
муру

2
Вся думка про змінні середовища мені здається дурною; Vim має спосіб вирішити специфічні для файлу настройки, і це називається autocmds. Схоже, ви щойно скопіювали це з посилання, але, схоже, автор цього не дуже знайомий з Вімом.
Мартін Турнойж

2
Навіщо його взагалі включати? Це нерозумний спосіб робити речі, і майже ніколи немає причин не використовувати autocmd. Коли ми це видалимо, нам залишається лише autocmd, що є тією ж відповіддю, яка вже тут уже півтора місяця. Ця відповідь не додає нічого, крім шуму.
Мартін Турноїй
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.