Comment éditer des fichiers crontab avec Vim (j'obtiens l'erreur: 'le fichier temp doit être édité sur place')

12

Comment éditer des crontabfichiers dans 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

Utiliser EDITOR=nvifonctionne bien ... Linux semble également fonctionner correctement ...

Martin Tournoij
la source

Réponses:

19

Le problème est de savoir comment Vim écrit des fichiers. Par défaut, il fait une copie du fichier et écrase l'original.

Vous pouvez observer cela avec:

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

# Open file in Vim, :wq

# inode changed!
$ ls -i a
3155322 a

crontabdevient confus par cela (voir :help crontab)

Vous devez utiliser :set backupcopypour yesque Vim écrase le fichier d'origine:

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

Vous pouvez le faire automatiquement pour les fichiers crontab avec:

au FileType crontab setlocal bkc=yes
Martin Tournoij
la source
2

L'auto-réponse de Martin est correcte. Une variante cependant, pour les gens comme moi qui essaient de limiter le remplissage de leur vimrcfichier avec des exceptions occasionnelles - ici l'édition d'une crontab, est d'utiliser des modelines. Cela permet de placer les exceptions directement dans le fichier cible.

Ci-dessous est ma modeline crontab:

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

Le bit important ici est celui bkc=yesqui correspond à la vimrcconfiguration de @ Martin . Les autres sont des paramètres de confort personnels.

Cela dit, pour être complet et nourrir la réflexion, la réponse initiale de @ Martin est la plus adéquate dans la majorité des cas.

JM. Marcastel
la source
1

Ce n'est pas la même erreur mais cela arrive aussi assez souvent:

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

Cette erreur apparaîtra, si vous utilisez viau lieu de vimpour crontab. Vous devez définir l'éditeur de crontab en ajoutant le code suivant dans votre ~/.bashrcfichier:

export EDITOR=vim
rubo77
la source
-1

La même chose se produit sur OSX. Après avoir enquêté sur le problème, j'ai trouvé que cela fonctionne avec plain vi, mais cela ne fonctionne pas avec vim.

Le correctif pourrait donc être:

EDITOR=vi crontab -e

Cependant, il viest généralement lié à vim(par exemple sur OSX) donc c'est la même chose.


Cela peut être résolu par la ligne suivante dans votre fichier vimrc :

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

Il existe une autre solution pour cela en ajoutant les lignes suivantes au fichier .vimrc :

if $VIM_NOBACKUP
  set nobackup
  set nowritebackup
endif

et exécutez la commande:

VIM_NOBACKUP=1 crontab -e

Vous pouvez également essayer de définir la variable suivante:

EDITOR='VIM_NOBACKUP=1 vim'

Source: crontab: le fichier temporaire doit être édité sur place


La raison pour laquelle cela se produit a à voir avec la manière vim/ vitraite les fichiers de sauvegarde.

Kenorb
la source
1
Depuis crontabsoulève généralement la valeur EDITORou VISUAL(si elle est définie), vous pouvez les définir: EDITOR='VIM_NOBACKUP=1 vim'.
muru
@muru, j'ai essayé, mais je ne pense pas que cela fonctionne. crontab -egénère crontab: VIM_NOBACKUP=1 vim: No such file or directory.
kenorb
1
Doit être une chose OSX, car cela fonctionne sur Arch Linux et Ubuntu, bash et zsh.
muru
2
Tout le déblayage avec les variables d'environnement me semble idiot; Vim a un moyen de gérer les paramètres spécifiques aux fichiers, et cela s'appelle autocmds. Il semble que vous veniez de le copier à partir du lien, mais il semble que l'auteur de cela ne soit pas très familier avec Vim.
Martin Tournoij
2
Pourquoi l'inclure du tout? C'est une façon stupide de faire les choses, et il n'y a presque jamais de raison de ne pas utiliser un autocmd. Lorsque nous supprimons cela, nous nous retrouvons avec uniquement l'autocmd, qui est la même réponse qui est ici depuis plus d'un mois et demi. Cette réponse n'ajoute que du bruit.
Martin Tournoij