Как мне отредактировать файлы 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чтобы yesVim перезаписал исходный файл:

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

Вы можете сделать это автоматически для файлов crontab с помощью:

au FileType crontab setlocal bkc=yes
Мартин Турной
источник
2

Ответ @ Мартина правильный. Однако, для таких людей, как я, которые пытаются ограничить заполнение своего vimrcфайла случайными исключениями, в данном случае редактирование crontab заключается в использовании моделин. Это позволяет помещать исключения непосредственно в целевой файл.

Ниже моя модел 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 является наиболее адекватным в большинстве случаев.

JM. Marcastel
источник
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
rubo77
источник
-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обрабатываются файлы резервных копий.

kenorb
источник
1
Поскольку , как crontabправило , поднимает значение EDITORили VISUAL(если она определена), вы можете установить их: EDITOR='VIM_NOBACKUP=1 vim'.
Муру
@muru Я пытался, но я не думаю, что это работает. crontab -eгенерирует crontab: VIM_NOBACKUP=1 vim: No such file or directory.
Кенорб
1
Должно быть, это вещь OSX, потому что она работает на Arch Linux и Ubuntu, bash и zsh.
Муру
2
Мне все глупо с переменными окружения; В Vim есть способ работать с настройками файлов, и он называется autocmds. Похоже, вы только что скопировали это из ссылки, но кажется, что автор этого не очень знаком с Vim.
Мартин Турной
2
Зачем включать это вообще? Это глупый способ делать вещи, и почти никогда не бывает причин не использовать autocmd. Когда мы удалим это, у нас останется только autocmd, который является тем же ответом, который был здесь более полутора месяцев. Этот ответ не добавляет ничего, кроме шума.
Мартин Турной