![符号链接指向相同的可执行目标,但执行不同的操作](https://linux22.com/image/187959/%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E6%8C%87%E5%90%91%E7%9B%B8%E5%90%8C%E7%9A%84%E5%8F%AF%E6%89%A7%E8%A1%8C%E7%9B%AE%E6%A0%87%EF%BC%8C%E4%BD%86%E6%89%A7%E8%A1%8C%E4%B8%8D%E5%90%8C%E7%9A%84%E6%93%8D%E4%BD%9C.png)
我的 Debian 机器中有vim-athena
软件包(观察到的情况相同)。vim-gtk
- 运行
vim
会在终端中生成 Vim。 - 运行
gvim
会在 Athena GUI 中生成一个带有 Vim 的新窗口。
但什么是vim
和gvim
?符号链接指向相同的目标。
$ readlink -e "$(type -p gvim)"
/usr/bin/vim.athena
$ readlink -e "$(type -p vim)"
/usr/bin/vim.athena
最终目标是二进制文件。
$ file --brief /usr/bin/vim.athena
ELF 64-bit LSB shared object, ...
如果两者都解析为相同的二进制文件,怎么可能会vim
做不同的事情呢?gvim
背景:
我正在通过更改我的默认编辑器update-alternatives --config editor
。在列表中,有vim.tiny
和vim.athena
,但即使我选择后者,Vim 总是在终端中打开,而不是在单独的 GUI 中打开。
答案1
该程序可以通过查看第零个参数argv[0]
(在本例中vim
为 或gvim
)来采取不同的路线。
Vim 这样做是在main.c
:
params.argv = argv;
...
/* Figure out the way to work from the command name argv[0].
"vimdiff" starts diff mode, "rvim" sets "restricted", etc. */
parse_command_name(¶ms);
...
/* Check for: [r][e][g][vi|vim|view][diff][ex[im]] (sort of) */
static void parse_command_name(mparm_T *parmp) {
char_u *initstr;
initstr = gettail((char_u *)parmp->argv[0]);
...
/* "gvim" starts the GUI. Also accept "Gvim" for MS-Windows. */
if (TOLOWER_ASC(initstr[0]) == 'g') {
main_start_gui();
在此片段中,程序检查 的基本名称的第一个字符是否
argv[0]
为“g”;如果是,则启动 GUI。
这可以通过创建链接来观察:
ln -s /usr/bin/vim.athena vimX
ln -s /usr/bin/vim.athena gvimX
ln -s /usr/bin/vim.athena evimX
ln -s /usr/bin/vim.athena rvimX
ln -s /usr/bin/vim.athena exX
whereX
是whatever,然后./vimX
在终端、./gvimX
GUI 中运行 Vim,./evimX
以简单模式运行 Vim 等等。