符号链接指向同一个可执行目标,但做不同的事情

Qua*_*odo 2 symlink

我的 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
Run Code Online (Sandbox Code Playgroud)

最终目标是一个二进制文件。

$ file --brief /usr/bin/vim.athena
ELF 64-bit LSB shared object, ...
Run Code Online (Sandbox Code Playgroud)

它怎么可能vimgvim如果双方决心相同的二进制做不同的事情?

背景:
我正在通过update-alternatives --config editor. 在列表中,有vim.tinyvim.athena,但即使我选择后者,Vim 也总是在终端中打开,而不是在单独的 GUI 中。

Qua*_*odo 7

该程序可以通过查看第零个参数argv[0](在本例中为vimgvim)来采取不同的路线。

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();
Run Code Online (Sandbox Code Playgroud)

在这个片段中,程序检查基本名称的第一个字符 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
Run Code Online (Sandbox Code Playgroud)

哪里X是什么,然后./vimX在终端中运行 Vim,./gvimX 在 GUI 中,./evimX在简单模式下运行 Vim,等等。