Wie bearbeite ich Crontab-Dateien mit Vim?

12

Wie bearbeite ich crontabDateien in 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

Verwenden EDITOR=nvifunktioniert gut ... Linux scheint auch gut zu funktionieren ...

Martin Tournoij
quelle

Antworten:

19

Das Problem ist, wie Vim Dateien schreibt. Standardmäßig wird eine Kopie der Datei erstellt und die Originaldatei überschrieben.

Sie können dies beobachten mit:

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

# Open file in Vim, :wq

# inode changed!
$ ls -i a
3155322 a

crontabwird dadurch verwirrt (siehe :help crontab)

Sie müssen verwenden :set backupcopy, yesum Vim die ursprüngliche Datei überschreiben zu lassen:

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

Sie können dies für crontab-Dateien automatisch tun mit:

au FileType crontab setlocal bkc=yes
Martin Tournoij
quelle
2

@ Martins Selbstantwort ist richtig. Eine Variante für Leute wie mich, die versuchen , das Auffüllen ihrer vimrcDatei mit gelegentlichen Ausnahmen zu begrenzen - hier das Bearbeiten einer Crontab - ist die Verwendung von Modelines. Dadurch können die Ausnahmen direkt in die Zieldatei eingefügt werden.

Unten ist meine Crontab Modeline:

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

Das Wichtige hier ist das, bkc=yeswas mit der vimrcKonfiguration von @ Martin übereinstimmt . Der Rest sind persönliche Einstellungen.

Aus Gründen der Vollständigkeit und des Denkvermögens ist die erste Antwort von @ Martin in den meisten Fällen am angemessensten.

JM. Marcastel
quelle
1

Nicht derselbe Fehler, aber auch sehr häufig:

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

Dieser Fehler wird angezeigt, wenn Sie vistatt vimfür crontab verwenden. Sie müssen den Editor von crontab einstellen, indem Sie den folgenden Code in Ihre ~/.bashrcDatei einfügen :

export EDITOR=vim
rubo77
quelle
-1

Das gleiche passiert unter OSX. Nachdem ich das Problem untersucht habe, habe ich festgestellt, dass es mit plain funktioniert vi, aber es funktioniert nicht mit vim.

Das Update könnte also sein:

EDITOR=vi crontab -e

Wird vijedoch normalerweise mit vim(z. B. unter OSX) verknüpft, so ist es dasselbe.


Dies kann durch die folgende Zeile in Ihrer vimrc- Datei behoben werden:

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

Hierfür gibt es eine andere Problemumgehung, indem Sie der .vimrc- Datei die folgenden Zeilen hinzufügen :

if $VIM_NOBACKUP
  set nobackup
  set nowritebackup
endif

und führe den Befehl aus:

VIM_NOBACKUP=1 crontab -e

Sie können auch versuchen, die folgende Variable zu definieren:

EDITOR='VIM_NOBACKUP=1 vim'

Quelle: crontab: temporäre Datei muss an Ort und Stelle bearbeitet werden


Der Grund, warum dies geschieht, hat mit der Art und Weise vim/ viBehandlung von Sicherungsdateien zu tun .

Kenorb
quelle
1
Da crontabtypischerweise den Wert anhebt EDITORoder VISUAL(falls definiert), können Sie sie einstellen: EDITOR='VIM_NOBACKUP=1 vim'.
muru
@muru Ich habe es versucht, aber ich glaube nicht, dass es funktioniert. crontab -eerzeugt crontab: VIM_NOBACKUP=1 vim: No such file or directory.
Kenorb
1
Muss ein OSX-Ding sein, denn es funktioniert unter Arch Linux und Ubuntu, bash und zsh.
muru
2
Das ganze Herumspielen mit Umgebungsvariablen kommt mir albern vor; Vim kann mit dateispezifischen Einstellungen umgehen und nennt sich autocmds. Es sieht so aus, als ob Sie dies gerade aus dem Link kopiert haben, aber es scheint, dass der Autor davon mit Vim nicht sehr vertraut ist.
Martin Tournoij
2
Warum überhaupt aufnehmen? Es ist eine alberne Art, Dinge zu tun, und es gibt so gut wie keinen Grund, kein AutocMD zu verwenden. Wenn wir das entfernen, bleibt uns nur die automatische Bestätigung. Dies ist die gleiche Antwort, die hier seit über eineinhalb Monaten vorliegt. Diese Antwort fügt nichts als Lärm hinzu.
Martin Tournoij