如何使用Vim编辑crontab文件(出现错误:“临时文件必须在适当位置进行编辑”)


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似乎也效果很好...

Answers:


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 backupcopyyes使Vim覆盖原始文件:

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

您可以使用以下命令自动对crontab文件执行此操作:

au FileType crontab setlocal bkc=yes

2

@Martin的自我回答是正确的。但是,对于像我这样试图限制偶发性例外来填充vimrc文件的人(这里在编辑crontab中)的一种变化是使用模式线。这允许将异常直接放置在目标文件中。

以下是我的crontab modeline:

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

这里重要的一点是bkc=yes匹配@Martin的vimrc配置。其余的是个人便利设置。

出于完整性和考虑的考虑,@ Martin的最初答案在大多数情况下是最充分的。


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 ,则会显示此错误。您需要通过在~/.bashrc文件中添加以下代码来设置crontab的编辑器:

export EDITOR=vim

-1

在OSX上也是如此。在研究了问题之后,我发现它可以与Plain一起使用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通常会提升EDITORVISUAL(如果已定义)的值,因此您可以设置它们:EDITOR='VIM_NOBACKUP=1 vim'
muru

@muru我已经尝试过了,但是我认为它没有用。crontab -e产生crontab: VIM_NOBACKUP=1 vim: No such file or directory
kenorb 2015年

1
必须是OSX,因为它可以在Arch Linux和Ubuntu,bash和zsh上运行。
muru

2
对环境变量的种种困扰对我来说似乎很愚蠢。Vim有一种处理文件特定设置的方法,称为autocmds。看起来您只是从链接中复制了此内容,但似乎该作者对Vim不太熟悉。
马丁·图尔诺伊

2
为什么要全部包含?这是一种愚蠢的做法,几乎没有理由不使用autocmd。当我们删除它时,只剩下autocmd,这是已经存在一个半月以上的答案。这个答案只会增加噪音。
马丁·图尔诺伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.