为什么vim作为别名运行" vi",在发生错误时返回非零退出代码?

时间:2017-10-10 11:16:57

标签: vim

在我的系统(Mac OS X)上,vi的别名为vim。但是,当以vi运行时,其退出代码的行为是不同的:当会话期间发生任何错误时,它将返回非零退出代码,如以下测试所示:

  • 在终端中,使用vim打开任何文件。
  • 做一些编辑。
  • 尝试使用:q退出。这会导致错误(自上次更改后无写入)。
  • 仍然使用:q!:wq退出。
  • 在终端中输入echo $?

如果我在第一步中使用vim打开vim,则返回码为0,但如果我使用vi则为1。

此问题可能是Vi is aliased to vim but exit with code 1的根本原因。

1 个答案:

答案 0 :(得分:0)

经过一番搜索,我在vim帮助中找到了以下注释,|posix-compliance|部分:

In 2005 the POSIX test suite was run to check the compatibility of Vim. ...
...
- vi test 310 fails; exit code non-zero when any error occurred?

这导致我the following section of the POSIX specification of vi

  

退出状态

     

应返回以下退出值:

     

0

     
    

成功完成。

  
     

大于0

     
    

发生错误。

  

显然,许多实用程序都有这样的退出状态规范,而且通常很合理。但不是vi的情况:作为一个交互式编辑器,一些命令完全有可能导致错误("发生错误"),但整个编辑器正常退出(& #34;成功完成")。因此,根据您的观点,规范本身是模糊的和/或矛盾的。

显然,编写POSIX测试套件的人决定了#34;成功完成的定义"应该严格:如果发生任何错误,则不能成功完成。因此vim未通过该测试。

当然,如果将vim的代码称为vi,则修改vim的代码并不难以遵守规范的解释。由于最新版本的vim似乎没有表现出这种行为,我想Mac OS X的人可能已经自己引入了这个补丁以通过POSIX测试。使用像git commit这样的实用程序的任何困难可能是他们最不关心的问题。