符号链接指向相同的可执行目标,但执行不同的操作

符号链接指向相同的可执行目标,但执行不同的操作

我的 Debian 机器中有vim-athena软件包(观察到的情况相同)。vim-gtk

  • 运行vim会在终端中生成 Vim。
  • 运行gvim会在 Athena GUI 中生成一个带有 Vim 的新窗口。

但什么是vimgvim?符号链接指向相同的目标。

$ 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.tinyvim.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(&params);
    ...

/* 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 等等。

相关内容