为什么将参数作为 vi 本身传递给 vi ?

为什么将参数作为 vi 本身传递给 vi ?

将第一个参数传递给 vi 作为 vi 本身的原因是什么,如下所示:

/bin/vi vi

为什么不直接写:

/bin/vi

我在这两个命令之间看到的唯一区别是,在vi没有vi参数打开的情况下执行vim,而如果我vi作为参数提供,则不会这样做。

这里发生了什么?

答案1

execl获取要运行的命令的路径,后跟参数;

按照惯例,第一个参数应该指向与正在执行的文件关联的文件名。

这就是为什么第一个参数是"vi".

您可以将其视为一方面指定命令的路径,另一方面指定argv程序接收的数组(我在这里稍微简化一下)。由调用者指定被调用者argv[0]将包含的内容。

程序可以用来argv[0]调整它们的行为;正如您所看到的,如果 Vim 被作为 调用,那么它的行为就像 Vi 一样vi。另一个例子是busybox在单个二进制文件中实现多种命令。

答案2

如果您在标准或标准兼容 shell 的命令行上编写以下命令:

/bin/vi vi

那么 shell 将/bin/vi使用参数运行vi。如果你跑

/bin/vi

相反,shell 将只运行/bin/vi.

事实上,这是一种简化。在系统调用级别,第一个将/bin/vi使用参数/bin/vi和运行vi,第二个将使用参数运行/bin/vi。通常,我们忽略“第零”参数,它只包含命令名称。

现在,我没有/bin/vi,而是/usr/bin/vi,它是 VIM 的某个版本。跑步

/usr/bin/vi vi

vi告诉它打开当前目录中调用的文件。跑步

/usr/bin/vi

只是告诉它启动,没有给出文件名,所以它打开一个未命名的缓冲区。在这种情况下,至少这个特定的 VIM 还会打印如下所示的问候语:

~                               VIM - Vi IMproved
~
~                                 version 8.0.707
~                           by Bram Moolenaar et al.
~            Modified by [email protected]
~                  Vim is open source and freely distributable

(它继续使用一些有用的命令,例如:q:help。)

当然,其他一些版本vi不会打印这样的横幅。

相关内容