¿Cómo edito archivos crontab con Vim? (Aparece el error: 'el archivo temporal debe ser editado en su lugar')

12

¿Cómo edito crontabarchivos en 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

Usar EDITOR=nvifunciona bien ... Linux también parece funcionar bien ...

Martin Tournoij
fuente

Respuestas:

19

El problema es cómo Vim escribe archivos. Por defecto, hace una copia del archivo y sobrescribe el original.

Puedes observar esto con:

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

# Open file in Vim, :wq

# inode changed!
$ ls -i a
3155322 a

crontabse confunde con esto (ver :help crontab)

Debe usar :set backupcopypara yeshacer que Vim sobrescriba el archivo original:

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

Puede hacer esto automáticamente para archivos crontab con:

au FileType crontab setlocal bkc=yes
Martin Tournoij
fuente
2

La auto respuesta de @ Martin es correcta. Sin embargo, una variación para las personas como yo que intentan limitar el llenado de su vimrcarchivo con excepciones ocasionales : aquí editar un crontab es utilizar modelinas. Esto permite colocar las excepciones directamente en el archivo de destino.

A continuación se muestra mi línea de tiempo crontab:

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

Lo importante aquí es lo bkc=yesque coincide con la vimrcconfiguración de @ Martin . El resto son configuraciones de conveniencia personal.

Dicho esto para completar y para pensar, la respuesta inicial de @ Martin es la más adecuada en la mayoría de los casos.

JM Marcastel
fuente
1

No es el mismo error, pero también ocurre con bastante frecuencia:

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

Este error aparecerá si lo usa en vilugar de vimcrontab. Debe configurar el editor de crontab agregando el siguiente código en su ~/.bashrcarchivo:

export EDITOR=vim
rubo77
fuente
-1

Lo mismo sucede en OSX. Después de investigar el problema, descubrí que funciona con normal vi, pero no funciona vim.

Entonces la solución podría ser:

EDITOR=vi crontab -e

Sin embargo, vigeneralmente está vinculado a vim(por ejemplo, en OSX), por lo que es lo mismo.


Esto se puede resolver mediante la siguiente línea en su archivo vimrc :

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

Hay otra solución para esto agregando las siguientes líneas al archivo .vimrc :

if $VIM_NOBACKUP
  set nobackup
  set nowritebackup
endif

y ejecuta el comando:

VIM_NOBACKUP=1 crontab -e

También puede intentar definir la siguiente variable:

EDITOR='VIM_NOBACKUP=1 vim'

Fuente: crontab: el archivo temporal debe editarse en su lugar


La razón por la que esto sucede tiene que ver con la forma vim/ vitrata los archivos de copia de seguridad.

kenorb
fuente
1
Dado que crontabnormalmente eleva el valor de EDITORo VISUAL(si está definida), se puede establecer que: EDITOR='VIM_NOBACKUP=1 vim'.
muru
@muru Lo he intentado, pero no creo que funcione. crontab -egenera crontab: VIM_NOBACKUP=1 vim: No such file or directory.
kenorb
1
Debe ser una cosa de OSX, porque funciona en Arch Linux y Ubuntu, bash y zsh.
muru
2
Todas las tonterías con las variables de entorno me parecen tontas; Vim tiene una manera de lidiar con configuraciones específicas de archivos, y se llama autocmds. Parece que acabas de copiar esto desde el enlace, pero parece que el autor no está muy familiarizado con Vim.
Martin Tournoij
2
¿Por qué incluirlo en absoluto? Es una forma tonta de hacer las cosas, y casi nunca hay una razón para no usar un autocmd. Cuando eliminamos eso, nos queda solo el autocmd, que es la misma respuesta que ha estado aquí durante más de un mes y medio. Esta respuesta no agrega nada más que ruido.
Martin Tournoij