将第一个参数传递给 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
不会打印这样的横幅。